Python使用枚举内部列表理解

Python使用枚举内部列表理解,python,list,iteration,list-comprehension,Python,List,Iteration,List Comprehension,假设我有这样一个列表: mylist = ["a","b","c","d"] 为了得到与索引一起打印的值,我可以使用Python的enumerate函数,如下所示 >>> for i,j in enumerate(mylist): ... print i,j ... 0 a 1 b 2 c 3 d >>> 现在,当我试图在列表中使用它时,它会给我这个错误 >>> [i,j for i,j in enumerate(mylist)]

假设我有这样一个列表:

mylist = ["a","b","c","d"]
为了得到与索引一起打印的值,我可以使用Python的
enumerate
函数,如下所示

>>> for i,j in enumerate(mylist):
...     print i,j
...
0 a
1 b
2 c
3 d
>>>
现在,当我试图在
列表中使用它时,它会给我这个错误

>>> [i,j for i,j in enumerate(mylist)]
  File "<stdin>", line 1
    [i,j for i,j in enumerate(mylist)]
           ^
SyntaxError: invalid syntax
>[i,j代表枚举中的i,j(mylist)]
文件“”,第1行
[i,j代表枚举中的i,j(mylist)]
^
SyntaxError:无效语法
因此,我的问题是:在列表理解中使用enumerate的正确方法是什么?

试试以下方法:

[(i, j) for i, j in enumerate(mylist)]
您需要将
i,j
放入元组中,列表理解才能工作。或者,如果
enumerate()
已返回元组,则可以直接返回元组,而无需先解包:

[pair for pair in enumerate(mylist)]
无论哪种方式,返回的结果都与预期的一样:

> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
以下是一种方法:

>>> mylist = ['a', 'b', 'c', 'd']
>>> [item for item in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
或者,您可以执行以下操作:

>>> [(i, j) for i, j in enumerate(mylist)]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

出现错误的原因是您缺少
i
j
周围的()以使其成为元组。

明确说明元组

[(i, j) for (i, j) in enumerate(mylist)]

或者,如果您不坚持使用列表理解:

>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

需要明确的是,这与
enumerate
无关,而与列表理解语法有关

此列表返回元组列表:

[(i,j) for i in range(3) for j in 'abc']
>>> {(i,j) for i,j in enumerate('abcdef')}
set([(0, 'a'), (4, 'e'), (1, 'b'), (2, 'c'), (5, 'f'), (3, 'd')])
这是一个目录:

[{i:j} for i in range(3) for j in 'abc']
名单:

[[i,j] for i in range(3) for j in 'abc']
语法错误:

[i,j for i in range(3) for j in 'abc']
不一致(IMHO)且与词典理解语法混淆:

>>> {i:j for i,j in enumerate('abcdef')}
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}
和一组元组:

[(i,j) for i in range(3) for j in 'abc']
>>> {(i,j) for i,j in enumerate('abcdef')}
set([(0, 'a'), (4, 'e'), (1, 'b'), (2, 'c'), (5, 'f'), (3, 'd')])
正如Óscar López所说,您可以直接传递枚举元组:

>>> [t for t in enumerate('abcdef') ] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')]

如果您使用的是长列表,那么列表理解速度似乎更快,更不用说更具可读性了

~$ python -mtimeit -s"mylist = ['a','b','c','d']" "list(enumerate(mylist))"
1000000 loops, best of 3: 1.61 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[(i, j) for i, j in enumerate(mylist)]"
1000000 loops, best of 3: 0.978 usec per loop
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[t for t in enumerate(mylist)]"
1000000 loops, best of 3: 0.767 usec per loop

都是很好的答案。我知道这里的问题是针对枚举的,但是像这样的问题怎么样,只是另一个角度

from itertools import izip, count
a = ["5", "6", "1", "2"]
tupleList = list( izip( count(), a ) )
print(tupleList)
如果必须在性能方面并行迭代多个列表,它将变得更加强大。只是一个想法

a = ["5", "6", "1", "2"]
b = ["a", "b", "c", "d"]
tupleList = list( izip( count(), a, b ) )
print(tupleList)

+1我没有测试它,但我敢打赌
[enumerate(我的列表)中的t代表t]
更快。不是必须要成为元组。任何使用i和j返回值的表达式都会增加枚举的次数,使用iterTools使其更有效如何?请记住,元组是由
而不是
()
构建的。所以“把
i,j
放在一个元组中”毫无意义,因为
i,j
已经是一个元组了!问题在于列表comp解析器需要语句组的参数。