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

标签 python algorithm

我试图获取给定整数的所有周围整数,从实际整数开始,一次从两侧向外,例如: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/

    相关文章:

    python - 让 Raspberry Pi 自动将文件上传到有请求的服务器

    python - 在 Python 的 imp 中, "ImportError: No frozen submodule named ..."

    algorithm - 4 求和时间复杂度

    algorithm - 并行算法分析中的“工作”,“跨度”和“时间”之间有什么区别?

    arrays - 在给定的 0's and 1' s 方阵中寻找 1 的最大方子矩阵?

    python - 在函数之间传递两个变量

    python - Unicode 编码、.txt 和阿拉伯语(从右到左)脚本

    php - 使用计数返回数组中的差异

    algorithm - 经典任务调度分配

    python - 简单 Python 代码中的 Str 对象错误