我有一個循環條件:大部分Pythonic for/enumerate循環?
for count, item in enumerate(contents):
,但只希望使用內容的前10個元素。什麼是最pythonic這樣做?
做一個:
if count == 10: break
似乎有點非Python化。有沒有更好的辦法?
我有一個循環條件:大部分Pythonic for/enumerate循環?
for count, item in enumerate(contents):
,但只希望使用內容的前10個元素。什麼是最pythonic這樣做?
做一個:
if count == 10: break
似乎有點非Python化。有沒有更好的辦法?
使用切片(切片表示法)
for count, item in enumerate(contents[:10]):
如果你迭代的發電機,或在您的列表中的項目很大,你不希望創建一個新的列表的開銷(如切片一樣),你可以使用islice
從itertools
模塊:
for count, item in enumerate(itertools.islice(contents, 10)):
無論哪種方式,我建議你在一個穩健的方式做到這一點,這意味着包裹functionalit Ÿ一個函數內(如一個想與這樣的功能做的 - 事實上,它的名稱功能的原因)
import itertools
def enum_iter_slice(collection, slice):
return enumerate(itertools.islice(collection, slice))
例子:
>>> enum_iter_slice(xrange(100), 10)
<enumerate object at 0x00000000025595A0>
>>> list(enum_iter_slice(xrange(100), 10))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9)]
>>> for idx, item in enum_iter_slice(xrange(100), 10):
print idx, item
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
如果您使用枚舉而你的count
變量只是爲了檢查物品的索引(這樣你就可以使用你的方法退出/中斷第10項的循環)。你不需要枚舉,只需要使用itertools.islice()
作爲你的函數。
for item in itertools.islice(contents, 10):
這看起來不錯! – Dirk
如果該列表是大或contents
是發電機,使用itertools.islice()
:
from itertools import islice
for count, item in enumerate(islice(contents, 10)):
對於較小的列表或元組,只是使用切片:
for count, item in enumerate(contents[:10]):
切片創建一個新的列表或元組對象,這對於10個項目來說並不算什麼大事。
只是一個增編兩個答案已經給出:
我建議認爲關於你的情況爲什麼的是,你想要做10次迭代並沒有更多?是否更希望在十個週期後中止(例如,因爲每個週期需要很長時間,並且在放棄完整性的同時整個運行時間應該是有限的),或者是要求前十個元素是特殊的一組項目的原因(也許十個顯示)?
在第一種情況下,我會說最正確的方法實際上是你提出的if ... break
,因爲它代表你的想法最直接。
在後一種情況下,我會建議命名孩子,我。即爲前十個元素的特殊組(例如elements_to_display
)引入一個發言名並對它們進行迭代。
您是否正在使用'enumerate()'來檢測您是否已經在前10個項目中循環了? –
是的,我使用'項目'術語來做一些解析之前,將它們添加到另一個列表。 – Dirk
@Dirk他的問題意味着,你是否在循環中的任何地方使用'count',除了將它用作'break'的標誌外# – thefourtheye