15

私は Python の初心者で、やろうとしていることの 1 つは、リストの理解に頭を悩ませることです。学ぶ価値のある非常に強力な機能であることがわかります。

cities = ['Chicago', 'Detroit', 'Atlanta']
airports = ['ORD', 'DTW', 'ATL']

print zip(cities,airports)
[('Chicago', 'ORD'), ('Detroit', 'DTW'), ('Atlanta', 'ATL')]

リスト内の一連のタプルではなく、リスト内の一連のリストとして結果を取得できるように、リスト内包表記を使用するにはどうすればよいですか?

[['Chicago', 'ORD'], ['Detroit', 'DTW'], ['Atlanta', 'ATL']]

(この状況ではおそらく辞書の方が適していると思いますが、リストをもう少しよく理解しようとしています)。ありがとう!

4

6 に答える 6

40

このようなもの:

[[c, a] for c, a in zip(cities, airports)]

別の方法として、listコンストラクターはタプルをリストに変換できます。

[list(x) for x in zip(cities, airports)]

または、mapこの場合、関数は少し冗長です。

map(list, zip(cities, airports))
于 2010-01-30T22:05:44.803 に答える
7

zip をまったく使用せずに実行したい場合は、次のようにする必要があります。

[ [cities[i],airports[i]] for i in xrange(min(len(cities), len(airports))) ]

しかし、知的訓練以外にそれを行う理由はありません。

を使用するmap(list, zip(cities, airports))と、より短く、より簡単になり、ほぼ確実に高速に実行されます。

于 2010-01-30T23:33:23.333 に答える
4

zipmap、またはの助けがなければ、リスト内包itertools表記は複数のシーケンスに「並列ループ」を設定できません。1 つのシーケンスの単純なループ、または複数のシーケンスの「ネストされた」ループのみです。

于 2010-01-30T22:10:20.160 に答える
1

これはzipの出力を受け取り、すべてのタプルをリストに変換します。

map(list, zip(cities, airports))

それぞれの性能については、次のとおりです。

$ python -m timeit -c '[ [a, b] for a, b in zip(xrange(100), xrange(100)) ]'
10000 loops, best of 3: 68.3 usec per loop

$ python -m timeit -c 'map(list, zip(xrange(100), xrange(100)))'
10000 loops, best of 3: 75.4 usec per loop

$ python -m timeit -c '[ list(x) for x in zip(range(100), range(100)) ]'
10000 loops, best of 3: 99.9 usec per loop
于 2010-01-30T22:08:41.490 に答える