Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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 有效的双for循环,其中第二个循环的范围取决于第一个循环的值_Python_Performance_For Loop_Itertools - Fatal编程技术网

Python 有效的双for循环,其中第二个循环的范围取决于第一个循环的值

Python 有效的双for循环,其中第二个循环的范围取决于第一个循环的值,python,performance,for-loop,itertools,Python,Performance,For Loop,Itertools,是否有更快的方法(可能使用itertools)来实现下面的代码 for i in range(0,10): for j in range(0,i+1): do stuff do stuff 谢谢。您正在生成带替换的组合,因此可以为您生成这些组合,尽管使用j和i反向: from itertools import combinations_with_replacement for j, i in combinations_with_replacement(rang

是否有更快的方法(可能使用
itertools
)来实现下面的代码

for i in range(0,10):
    for j in range(0,i+1):
        do stuff
    do stuff
谢谢。

您正在生成带替换的组合,因此可以为您生成这些组合,尽管使用
j
i
反向:

from itertools import combinations_with_replacement

for j, i in combinations_with_replacement(range(10), 2):
    # ...
注意
j
i
的倒装;这将生成与嵌套循环相同的值对,只是顺序不同:

>>> sorted(combinations_with_replacement(range(10), 2)) == sorted((j, i) for i in range(10) for j in range(i + 1))
True
您正在生成带替换的组合,因此可以为您生成这些组合,尽管使用
j
i
反转:

from itertools import combinations_with_replacement

for j, i in combinations_with_replacement(range(10), 2):
    # ...
注意
j
i
的倒装;这将生成与嵌套循环相同的值对,只是顺序不同:

>>> sorted(combinations_with_replacement(range(10), 2)) == sorted((j, i) for i in range(10) for j in range(i + 1))
True


您是否需要一次遍历两个列表并验证同一位置上的每个列表值?以上两个问题我都不太理解。很抱歉但是我希望能够在第一个循环中,独立于j循环,如果这有意义的话。我会更新这个问题。如果你需要所有的迭代,你就不能对这个代码进行太多优化。我只是注意到你修改了这个问题,这样你就需要在外循环和内循环中做一些事情。在这种情况下,尝试用itertools做任何聪明的事情都是没有意义的:任何微小的节省都将通过在每次迭代中进行
if
测试来抵消。否则,您可以这样做:
对于组合中的i,j(范围(4,-1,-1),2):打印(i-1,j)
您是否需要一次遍历两个列表并验证同一位置上的每个列表值?以上两个问题我都不太理解。很抱歉但是我希望能够在第一个循环中,独立于j循环,如果这有意义的话。我会更新这个问题。如果你需要所有的迭代,你就不能对这个代码进行太多优化。我只是注意到你修改了这个问题,这样你就需要在外循环和内循环中做一些事情。在这种情况下,尝试用itertools做任何聪明的事情都是没有意义的:任何微小的节省都会被每次迭代都要做的
if
测试所抵消。否则,你可以这样做:
对于i,j的组合(范围(4,-1,-1),2):打印(i-1,j)
非常感谢你这么做。非常感谢您的帮助。请注意,OP现在必须在内部循环和外部循环中执行操作。@PM2Ring:这取决于OP对每个不同的
i
值执行的操作,如果这很重要的话。如果你的
i
值已经被看到(比如集合或字典),你可以使用不同的方法来跟踪。当然可以,但是你仍然需要在每次迭代中进行测试。而且,仅仅改变输出顺序的做法,并不像“代码>组合”和“替换”产生的时髦顺序那样激烈但是我想这取决于应用程序。@Jack同时,你可以简单地分别执行
I
循环和
I,j
循环,对
I
东西使用简单的
for
循环,对
I,j
循环使用Martijn或我的解决方案。这样你就不需要做我刚才说的测试了。但使用你在问题中发布的循环可能更容易。:)非常感谢你这么做。非常感谢您的帮助。请注意,OP现在必须在内部循环和外部循环中执行操作。@PM2Ring:这取决于OP对每个不同的
i
值执行的操作,如果这很重要的话。如果你的
i
值已经被看到(比如集合或字典),你可以使用不同的方法来跟踪。当然可以,但是你仍然需要在每次迭代中进行测试。而且,仅仅改变输出顺序的做法,并不像“代码>组合”和“替换”产生的时髦顺序那样激烈但是我想这取决于应用程序。@Jack同时,你可以简单地分别执行
I
循环和
I,j
循环,对
I
东西使用简单的
for
循环,对
I,j
循环使用Martijn或我的解决方案。这样你就不需要做我刚才说的测试了。但使用你在问题中发布的循环可能更容易。:)