gpt4 book ai didi

python - 围绕数字生成圆形图案的最简单方法

转载 作者:行者123 更新时间:2023-12-03 18:57:17 24 4
gpt4 key购买 nike

我试图获取给定整数的所有周围整数,从实际整数开始,一次从两侧向外,例如:generateNeighborhood(10, 3) ,其中 10是原点和3邻里的半径,应该返回 [10,11,9,12,8,13,7] .
到目前为止,我的尝试是这样的:

def generateNeighborhood(c: int, r: int):
yield c
for i in range(1, r + 1):
for j in range(2):
yield c + i * (-1) ** j
你知道实现这些结果的任何更简单的方法吗?

最佳答案

一种。
这是一个简单的单行:

>>> c, r = 10, 3
>>> sorted(range(c-r, c+r+1), key=lambda n: (abs(c-n), -n))
[10, 11, 9, 12, 8, 13, 7]
range()可以很容易地给我们我们需要的数字,但要按正确的顺序排列, 按距离排序 从中心 c , 使用 abs() .并且要在该对中较小的邻居之前获得较大的邻居(9 之前的 11),请使用 -n对于较大的邻居来说,这更负面(更小)。
如果您希望较小的邻居在较大的邻居之前,请翻转符号:
>>> sorted(range(c-r, c+r+1), key=lambda n: (abs(c-n), n))
[10, 9, 11, 8, 12, 7, 13]
在发电机中:
def generateNeighborhood(c: int, r: int):
yield from sorted(range(c-r, c+r+1), key=lambda n: (abs(c-n), -n))
但请注意 sorted() returns a list无论如何,还不如放 return sorted(...) .对于非常长的列表(大半径 r),请使用( B )原始代码的修改版本或( C )下面的变体:

B.
user3386109 suggested in the comments ,您可以删除 j循环并产生该半径的邻居:
def generateNeighborhood(c: int, r: int):
yield c
for i in range(1, r + 1):
yield c + i
yield c - i

C。
这是一个带有生成器表达式的变体:
def generateNeighborhood(c: int, r: int):
yield c
pairs = ((c + i, c - i) for i in range(1, r + 1)) # generator, not expanded here
yield from (n for pair in pairs for n in pair) # processed one at a time

小半径和大半径的性能:
小号: list(generateNeighborhood(10, 3)) - B 快于 A 快于 C
  • B:1.19 微秒
  • 答:2.53 微秒
  • C:2.6 微秒

  • 大号: list(generateNeighborhood(10, 3_000_000)) - B 快于 C 快于 A:
  • B:877 毫秒
  • C: 1.43 秒
  • 答:2.97 秒

  • 所以为了简单起见,选择 A。为了速度,选择 B。(我认为 C 会击败 B,但事实并非如此。)

    关于python - 围绕数字生成圆形图案的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65621653/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com