2013-02-13 68 views
48

考慮,我在一個新的列表2中的所有項目指數值從1增加至3列表1以下Python代碼:是Python列表理解訪問索引/枚舉可能嗎?

for ind, obj in enumerate(list1): 
    if 4> ind > 0: list2.append(obj) 

你會怎麼寫使用Python列表理解,如果我都進不去通過枚舉指數?

類似:

list2 = [x for x in list1 if 4>ind>0] 

但因爲我沒有 'IND' 號,將這項工作? :

list2 = [x for x in enumerate(list1) if 4>ind>0] 
+3

我想你的實際用例更復雜,但是你可以簡單地將'list1 [1:4]'切片到這裏 – wim 2013-02-13 23:12:57

+0

你就像我可以在列表理解中切分列表一樣? like:'[x for x in list1 [1:4]]'? – 2013-02-13 23:31:29

+0

@PavAmetvic,沒有@wim意味着您可以在BrenBarn之前回答30秒,並且因爲您遵循PEP8建議(http://www.python.org/dev/),只寫'list2 = list1 [1:4]' – 2013-02-13 23:59:04

回答

108
list2 = [x for ind, x in enumerate(list1) if 4 > ind > 0] 
+9

+1 peps -pep-0008 /#whitespace-in-expressions-and-statements):) – furins 2013-02-13 23:04:32

24

如果使用enumerate,你訪問索引:

list2 = [x for ind, x in enumerate(list1) if 4>ind>0] 
+7

+1以30秒爲單位解釋你的答案:) – furins 2013-02-13 23:05:23

1

除非你的實際使用情況更復雜,你應該只使用一個列表的片段作爲通過@wim

>>> list1 = ['zero', 'one', 'two', 'three', 'four', 'five', 'six'] 
>>> [x for ind, x in enumerate(list1) if 4 > ind > 0] 
['one', 'two', 'three'] 
>>> list1[1:4] 
['one', 'two', 'three'] 

建議對於更復雜的情況下, - 如果你實際上並不需要的指數 - 它更清晰遍歷切片或islice

list2 = [x*2 for x in list1[1:4]] 

from itertools import islice 
list2 = [x*2 for x in islice(list1, 1, 4)] 

對於小片,簡單list1[1:4]。如果切片可能變得相當大,則使用切片避免複製內存可能會更好

+0

謝謝,但是因爲我想對'x'內部的理解(讓我把它存儲在新列表之前,讓它看起來像使用列表中的切片理解是最好的方法!謝謝 – 2013-02-14 00:19:26

+0

@PavAmetvic,那麼這些情況下仍然很簡單,不需要枚舉 – 2013-02-14 00:36:35