在python中嵌套for循环中使用索引的推荐样式

2024-05-13 04:51:11 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑一个C样式嵌套的for循环,如下所示:

for i = 0; i < n; i++ {
    for j = i; j < n; j++ {
        do_something();
    }
}

推荐的python翻译是什么?在

Effective Python之后,我在想:range(len(something))应该尽量避免使用{},我想:

^{pr2}$

但是enumerate和{}的混合似乎不一致。在

鉴于

for i in range(len(some_iter)):
    for j in range(i, len(some_iter)):
        do_something()

看起来一致,但使用range(len(some_iter))。在

对此,建议使用什么Python样式?在


Tags: inforlenrange样式somedo建议
2条回答

我尽量使用for item in itemList:,而不是使用i作为变量,i作为迭代器。在

for i in some_iter:
    for j in some_iter[some_iter.index(i):-1]
        doSomething()

所以第二个for循环将列表从当前项的索引切片到末尾。在

如前所述,实际上您并没有将i或{}用于任何事情,所以嵌套循环是无稽之谈;您可以将计算的循环次数作为单个顶级循环循环。在

{从给定的一个输入序列}中可以看到一个唯一的输入序列}:

import itertools

for x, y in itertools.combinations_with_replacement(some_iter, 2):
    do_something(x, y)

在没有不必要的索引的情况下,Pythonic等价于:

^{pr2}$

如果还需要索引,只需将其与enumerate配对:

for (ix, x), (iy, y) in itertools.combinations_with_replacement(enumerate(some_iter), 2):
    do_something(ix, x, iy, y)

使用itertools.combinations_with_replacement(有或没有enumerate)将更有效,也更通用:如果依赖于索引,则将输入限制为序列,因此如果不首先将它们转换为序列,则任意iterable(setdict,生成器表达式等)将无法工作。使用Pythonic方法意味着您可以接受并使用任何有限iterable,而无需执行手动类型转换和索引。在

相关问题 更多 >