2014-01-06 24 views
5

我有一個循環條件:大部分Pythonic for/enumerate循環?

for count, item in enumerate(contents): 

,但只希望使用內容的前10個元素。什麼是最pythonic這樣做?

做一個:

if count == 10: break 

似乎有點非Python化。有沒有更好的辦法?

+0

您是否正在使用'enumerate()'來檢測您是否已經在前10個項目中循環了? –

+0

是的,我使用'項目'術語來做一些解析之前,將它們添加到另一個列表。 – Dirk

+0

@Dirk他的問題意味着,你是否在循環中的任何地方使用'count',除了將它用作'break'的標誌外# – thefourtheye

回答

11

使用切片(切片表示法)

for count, item in enumerate(contents[:10]): 

如果你迭代的發電機,或在您的列表中的項目很大,你不希望創建一個新的列表的開銷(如切片一樣),你可以使用isliceitertools模塊:

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): 
+0

這看起來不錯! – Dirk

5

如果該列表是大或contents是發電機,使用itertools.islice()

from itertools import islice 

for count, item in enumerate(islice(contents, 10)): 

對於較小的列表或元組,只是使用切片:

for count, item in enumerate(contents[:10]): 

切片創建一個新的列表或元組對象,這對於10個項目來說並不算什麼大事。

0

只是一個增編兩個答案已經給出:

我建議認爲關於你的情況爲什麼的是,你想要做10次迭代並沒有更多?是否更希望在十個週期後中止(例如,因爲每個週期需要很長時間,並且在放棄完整性的同時整個運行時間應該是有限的),或者是要求前十個元素是特殊的一組項目的原因(也許十個顯示)?

在第一種情況下,我會說最正確的方法實際上是你提出的if ... break,因爲它代表你的想法最直接。

在後一種情況下,我會建議命名孩子,我。即爲前十個元素的特殊組(例如elements_to_display)引入一個發言名並對它們進行迭代。