按绝对值之和的顺序迭代对

Rap*_*ael 7 python

我想按照整数对的绝对值之和的顺序迭代整数对。该列表应如下所示:

(0,0)
(-1,0)
(0,1)
(0,-1)
(1,0)
(-2,0)
(-1,1)
(-1,-1)
(0,2)
(0,-2)
(1,1)
(1,-1)
(2,0)
[...]
Run Code Online (Sandbox Code Playgroud)

对于具有相同绝对值总和的对,我不介意它们的顺序。

理想情况下,我希望能够永远创建这些对,以便我可以依次使用每一对。你怎么能这么做呢?

对于固定范围,我可以用一种丑陋的方式制作对列表:

sorted([(x,y)for x in range(-20,21)for y in range(-20,21)if abs(x)+abs(y)<21],key=lambda x:sum(map(abs,x))
Run Code Online (Sandbox Code Playgroud)

这不允许我永远迭代,也不允许一次给我一对。

Sha*_*ger 9

这似乎可以解决问题:

from itertools import count  # Creates infinite iterator

def abs_value_pairs():
    for absval in count():  # Generate all possible sums of absolute values
        for a in range(-absval, absval + 1):  # Generate all possible first values
            b = abs(a) - absval  # Compute matching second value (arbitrarily do negative first)
            yield a, b
            if b:  # If first b is zero, don't output again, otherwise, output positive b
                yield a, -b
Run Code Online (Sandbox Code Playgroud)

它会永远运行,并且运行高效(避免不必要的重新计算)。