我试图获取给定整数的所有周围整数,从实际整数开始,一次从两侧向外,例如: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大号:
list(generateNeighborhood(10, 3_000_000))
- B 快于 C 快于 A:所以为了简单起见,选择 A。为了速度,选择 B。(我认为 C 会击败 B,但事实并非如此。)
关于python - 围绕数字生成圆形图案的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65621653/