Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代一组在正负数值之间交替的数字_Python_Iteration - Fatal编程技术网

Python 迭代一组在正负数值之间交替的数字

Python 迭代一组在正负数值之间交替的数字,python,iteration,Python,Iteration,我想通过迭代数字得到输出: (0,0) (1,0) (0,1) (0,-1) (-1,0) (1,-1) (-1,1) (1,1) (2,0) (-2,0) (2,1) (-2,1) (2,-1) (2,2) (0,2) # the order in which they come isn't important as long as it doesn't start the next absolute value once all smaller have been done i.e. do

我想通过迭代数字得到输出:

(0,0)
(1,0)
(0,1)
(0,-1)
(-1,0)
(1,-1)
(-1,1)
(1,1)
(2,0)
(-2,0)
(2,1)
(-2,1)
(2,-1)
(2,2)
(0,2)  # the order in which they come isn't important as long as it doesn't start the next absolute value once all smaller have been done i.e. don't start two once every combination of 0,1 and -1 has been found
...
# up to n, unless the condition is met then it will break the loop
因此,有效地将正负数的每一个组合都增加到
+/-n

我目前在itertools.permutations(范围(-n,n),2)中对a,b使用此
。然而,我随后将所有值添加到一个数组(
valid\u answers
)并找到它们的最小绝对值之和。(
vals=sorted(有效答案,key=lambda t:sum([abs(t[0]),abs(t[1])))

我只想从0迭代,而不是从
-n
n
。它将在第一次满足条件时中断。我希望这段代码足以解释我想做什么。如果没有,完整的代码(足以复制我正在做的事情)是可用的。(第51行及以后)

编辑
我在想也许乘以-1的幂是一种可能的方法,但我不太清楚如何处理它。

这可能有点冗长,但它应该可以工作

从itertools导入置换
def get_值(n):
out=[]
如果n<0:
返回
out.append((0,0))
如果n==0:
返回
对于范围(1,n+1)内的i:
out+=[(i,j)表示范围内的j(-i,i+1)]
out+=[(-i,j)表示范围内的j(-i,i+1)]
返回

这就是我想要的解决方案

def get_values(n: int) -> list:
    if n < 0:
        return []

    if n == 0:
        return [(0, 0)]

    out = set()
    for i in range(0, n + 1):
        for j in range(0, i + 1):
            out.add((i, j))
            out.add((-i, j))
            out.add((i, -j))
            out.add((-i, -j))
    return sorted(out, key=lambda t: abs(t[0]))


...



for item in get_values(n=1000):
    a, b = item
    ...
def get_值(n:int)->列表:
如果n<0:
返回[]
如果n==0:
返回[(0,0)]
out=set()
对于范围(0,n+1)内的i:
对于范围(0,i+1)内的j:
加上((i,j))
out.加上(-i,j))
加上((i,-j))
out.加上(-i,-j))
已排序的返回值(out,key=lambda t:abs(t[0]))
...
对于get_值中的项目(n=1000):
a、 b=项目
...
它创建一个集合(无重复项),并将所有数字组合添加到集合中。然后返回此集合的排序列表。我不认为这是最有效的方法,所以我们会喜欢更快、更干净的方法


这个答案主要来自另一个答案,所以谢谢

排序以找到最小值是低效的,因为您需要花时间排序您不关心其相对顺序的对。改用
heapq
模块。但这似乎是一个没有实际意义的观点;绝对值的最小和总是0+0。我只需要满足特定条件的值,即附加到集合中的值@ChepneryYou从未提及仅选择配对的子集。这是在代码块末尾提到的,我也将其添加到了答案中。我也不认为迭代
范围(-n,n+1)
与迭代
范围(0,n+1)
并为每个值创建多个配对相比有什么问题。你只是在转移工作。这是一个非常占用内存的解决方案,所以我认为这离理想还很远!