136

次のようなリストがあるとします。

mylist = ["a","b","c","d"]

値をインデックスとともに出力するには、次のenumerateように Python の関数を使用できます。

>>> 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

だから、私の質問は次のとおりです。リスト内包表記内で列挙を使用する正しい方法は何ですか?

4

7 に答える 7

181

これを試して:

[(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')]
于 2012-05-27T21:05:15.080 に答える
47

明確にするために、これはリスト内包表記とは何の関係もなく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']

これは矛盾しており(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,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')]
于 2012-05-27T21:27:34.977 に答える
32

または、リスト内包表記の使用を主張しない場合:

>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
于 2012-05-27T21:18:27.990 に答える
12

長いリストを使用している場合は、リストの理解がより速くなり、読みやすくなることは言うまでもありません。

~$ 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
于 2012-05-27T22:46:28.680 に答える
12

これを行う方法は次のとおりです。

>>> 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')]

エラーが発生した理由は、() が抜けていてijそれをタプルにしたためです。

于 2012-05-27T21:05:27.163 に答える
6

タプルについて明示してください。

[(i, j) for (i, j) in enumerate(mylist)]
于 2012-05-27T21:05:32.090 に答える
0

すべての素晴らしい答えの人。ここでの質問は列挙に固有のものであることは知っていますが、このようなものはどうですか、別の視点です

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)
于 2016-11-28T22:41:05.313 に答える