次のようなリストがあるとしましょう:
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
したがって、私の質問は次のとおりです。リスト内包表記の列挙を使用する正しい方法は何ですか?
これを試して:
[(i, j) for i, j in enumerate(mylist)]
リストの内包表記を機能させるには、タプル内にi,j
を配置する必要があります。あるいは、enumerate()
alreadyがTupleを返す場合、最初にアンパックせずに直接返すことができます:
[pair for pair in 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 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')])
オスカー・ロペスが述べたように、列挙タプルを直接渡すことができます:
>>> [t for t in enumerate('abcdef') ]
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')]
または、リスト内包表記の使用を主張しない場合:
>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
長いリストを使用している場合、読みやすさは言うまでもなく、リストの理解が速いように見えます。
~$ 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
これを行う方法は次のとおりです。
>>> 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)]
すべての素晴らしい答えの男。私はここでの質問が列挙に固有のものであることを知っていますが、このようなものはどうですか?
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)
Mylist = ["a"、 "b"、["x"、 "y"]、 "d"]の場合の処理方法