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或我的解决方案。这样你就不需要做我刚才说的测试了。但使用你在问题中发布的循环可能更容易。:)