让我们假设我有一个这样的名单:
mylist = ["a","b","c","d"]
相处与他们的索引,我可以使用Python的印刷值enumerate
函数这样
>>> for i,j in enumerate(mylist):
... print i,j
...
0 a
1 b
2 c
3 d
>>>
现在,当我尝试使用它里面一个list comprehension
它给了我这个错误
>>> [i,j for i,j in enumerate(mylist)]
File "<stdin>", line 1
[i,j for i,j in enumerate(mylist)]
^
SyntaxError: invalid syntax
所以,我的问题是:什么是用枚举内部列表中理解的正确方法是什么?
Answer 1:
试试这个:
[(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')]
Answer 2:
只要是真正清楚,这已经无关enumerate
和一切与列表中理解语法。
这个列表理解返回元组的列表:
[(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']
语法错误:
[i,j for i in range(3) for j in 'abc']
这是不一致的(恕我直言)和混乱与字典推导语法:
>>> {i:j for i,j in enumerate('abcdef')}
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'}
和一组元组:
>>> {(i,j) for i,j in enumerate('abcdef')}
set([(0, 'a'), (4, 'e'), (1, 'b'), (2, 'c'), (5, 'f'), (3, 'd')])
奥斯卡·洛佩斯说,你可以直接通过枚举元组:
>>> [t for t in enumerate('abcdef') ]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')]
Answer 3:
或者,如果你不坚持使用列表理解:
>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
Answer 4:
如果您使用长的列表,它出现在列表解析的速度更快,更不要说更具有可读性。
~$ 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
Answer 5:
这里有一个办法做到这一点:
>>> 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
使它成为一个元组。
Answer 6:
更明确一些元组。
[(i, j) for (i, j) in enumerate(mylist)]
Answer 7:
所有伟大的答案家伙。 我知道这里的问题是特定于枚举但如何对这样的事情,只是另一个角度
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)
文章来源: Python using enumerate inside list comprehension