簡體   English   中英

Python 范圍 len 與枚舉

[英]Python range len vs enumerate

我從范圍(len(列表))或枚舉(列表)讀取? 使用range(len(s))並不是編寫 Python 的好方法。 如果我們不需要循環len(s)次但例如len(s)//3次或len(s)-5次,如何以另一種方式編寫 for 循環? 是否可以將這些循環轉換為使用enumerate

例如,我有一個項目,其中有一個包含 3n 個元素“s[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)

如果您遍歷整個列表:

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)

等等。

我不確定為什么要遍歷列表的一部分,這看起來很奇怪。 我很想聽聽您的用例,因為它可能會得到改進。

查看您現在發布的代碼,@Metareven 有一個很好的解決方案 - 以您要處理的大小的塊迭代列表。

您的代碼看起來還不錯,但是如果您想一次迭代 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)

它接縫您想通過某種滑動窗口瀏覽您的收藏。 在這種情況下,我建議使用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]

使用 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM