2013-02-13 42 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