列挙型内部リスト内包表記を使用するPython


125

私がこのようなリストを持っているとしましょう:

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

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

回答:


166

これを試して:

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

4
タプルである必要はありません。値を返すiとjを使用する式はすべて実行されます
Alvaro

列挙型の使用は素晴らしいですが、itertoolsを使用して効率を上げるのはどうですか
Pramit

3
ただ、タプルがで構築されていることを覚えてい, ません()。そのため、「i,jタプル内への配置」i,jはすでにタプルであるため、意味がありません。問題は、リスト・コンプ・パーサーがステートメント・グループの括弧を必要とすることです。
2017年

46

本当に明確にするために、これは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')]

32

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

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

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

2
+1テストはしませんでした[t for t in enumerate(my list)]が、もっと速いと思います。
オオカミ

11

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

>>> 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それタプルにします。



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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.