[英]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.