高效的 double for 循环,其中第二个循环的范围取决于第一个循环的值
Posted
技术标签:
【中文标题】高效的 double for 循环,其中第二个循环的范围取决于第一个循环的值【英文标题】:Efficient double for loop where range of second loop depends on value of first 【发布时间】:2018-06-17 15:03:53 【问题描述】:有没有更快的方法(可能使用itertools
)来实现下面的代码?
for i in range(0,10):
for j in range(0,i+1):
do stuff
do stuff
谢谢。
【问题讨论】:
您是否需要一次遍历两个列表并在同一位置验证每个列表值? 以上两个问题我都不太明白。对不起。但是如果有意义的话,我希望能够在与 j 循环分开的第一个循环中做一些事情。我会更新问题。 如果你需要所有的迭代,你不能优化这段代码。 我刚刚注意到您修改了问题,以便您需要在外循环和内循环中做一些事情。在这种情况下,尝试用 itertools 做任何聪明的事情是没有意义的:任何微小的节省都会被 每次 迭代都进行if
测试所抵消。
否则,您可以这样做:for i, j in combinations(range(4, -1, -1), 2): print(i-1, j)
【参考方案1】:
您正在生成替换组合,所以itertools.combinations_with_replacement()
可以为您生成这些,尽管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
【讨论】:
非常感谢您。非常感谢您的帮助。 请注意,OP 现在必须在内部循环和外部循环中执行操作。 @PM2Ring:这取决于 OP 想要为每个不同的i
值做什么,如果这很重要的话。如果您的 i
值已被看到(例如集合或字典),您始终可以使用不同的方式来跟踪。
嗯,当然,但您仍然必须在每次迭代时进行该测试。恕我直言,仅仅颠倒输出顺序并不像combinations_with_replacement
产生的时髦顺序那么激烈。 :) 但我想这取决于应用程序。
@Jack 同时,您可以简单地分别执行i
循环和i,j
循环,对i
内容使用简单的for
循环,以及Martijn 的或我对i,j
循环的解决方案。这样你就不需要做我之前提到的测试了。但仅使用您在问题中发布的循环可能更容易。 :)以上是关于高效的 double for 循环,其中第二个循环的范围取决于第一个循环的值的主要内容,如果未能解决你的问题,请参考以下文章
在以下情况下,如何在第二个 for 循环中访问 (i+1 ) 索引?
请教个java for 循环问题。。用个for循环,第一次循环时取第一个值,第二次循环时取第二个值。以此类推