Python范围len vs enumerate

时间:2018-02-27 10:37:06

标签: python python-3.x

我从range(len(list)) or enumerate(list)?读到使用range(len(s))并不是编写Python的好方法。如果我们不需要循环len(s)次,但例如len(s)//3次或len(s)-5次,那么如何以替代方式为循环编写?是否可以将这些循环转换为使用enumerate

例如,我有一个项目,我有一个3n元素的列表[0],s [1],...,s [3n-1]',我需要在nx3表中打印它们。我写了类似

的代码
for i in range(len(s)//3):
    row = str(s[3*i]) + " " + str(s[3*i+1]) + " " + str(s[3*i+2])
    print(row)

4 个答案:

答案 0 :(得分:5)

如果你在整个列表上进行迭代:

for x in lst:
    print(x)

如果您在整个列表上进行迭代,但只需要索引:

for i, _ in enumerate(lst):
    print(i)

如果您在整个列表上进行迭代,但不需要索引或数据:

for _ in lst:
    print("hello")

如果您正在迭代列表的一部分:

for x in lst[:-5]:
    print(x)

等等。

我不确定为什么要迭代列表的 part ,这看起来很奇怪。我有兴趣听听你的用例,因为它可能会有所改进。

查看您现在发布的代码,@ Metareven有一个很好的解决方案 - 以您想要处理的大小的块的形式迭代列表。

答案 1 :(得分:1)

你的代码看起来并不那么糟糕,但如果你想一次迭代3个元素,我会创建一个for循环,将i变量增加3而不是1,如下所示:

for i in range(0,len(s),3):
  row = str(s[i]) + " " + str(s[i+1]) + " " + str(s[i+2])
  print(row)

答案 2 :(得分:0)

你希望通过某种滑动窗口浏览你的收藏。在这种情况下,我建议使用itertools.islice

>>> from itertools import islice
>>> 
>>> s = [i for i in range(10)] # Or whatever iterable you have
>>> 
>>> iter1 = islice(s, 1, None)
>>> iter2 = islice(s, 2, None)
>>> 
>>> for a, b, c in zip(s, iter1, iter2):
...     print('[{}, {}, {}]'.format(a, b, c))
... 
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
[6, 7, 8]
[7, 8, 9]

如果您不介意复制数据,可以使用传统的切片表示法:

>>> s = [i for i in range(10)] # Again, this could be any iterable
>>> 
>>> for a, b, c in zip(s, s[1:], s[2:]):
...     print('[{}, {}, {}]'.format(a, b, c))
... 
[0, 1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
[5, 6, 7]
[6, 7, 8]
[7, 8, 9]

答案 3 :(得分:0)

使用 itertools 的解决方案,

import itertools

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    args = [iter(iterable)] * n
    return itertools.zip_longest(*args, fillvalue=fillvalue)

s = list(range(10))

for row in list(grouper(s, 3)):
    print(row)

给予

(0, 1, 2)
(3, 4, 5)
(6, 7, 8)
(9, None, None)

[Program finished]

其他想法


# if you're printing it straight away, you might as well
print(*s[3*i: 3*i+3], sep=' ')

for i in range(0, len(s), 3):
    print(' '.join(s[i:i + 3])

# so you can kind of cheat with numpy for this:

for row in numpy.array(s).reshape((3,-1)):
     print(row)