Использование списка понимания в Python, чтобы сделать что-то похожее на zip ()? - PullRequest
9 голосов
/ 31 января 2010

Я новичок в Python, и одна из вещей, которые я пытаюсь сделать, - обернуть голову вокруг понимания списка. Я вижу, что это довольно мощная функция, которую стоит изучить.

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

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

Как использовать понимание списка, чтобы я мог получать результаты в виде серии списков в списке, а не в виде последовательности кортежей в списке?

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

(Я понимаю, что словари, вероятно, были бы более подходящими в этой ситуации, но я просто пытаюсь понять списки немного лучше). Спасибо!

Ответы [ 5 ]

30 голосов
/ 31 января 2010

Примерно так:

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

Альтернативно, конструктор list может преобразовывать кортежи в списки:

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

Или функция map в этом случае немного менее многословна:

map(list, zip(cities, airports))
5 голосов
/ 31 января 2010

Если вы хотите сделать это вообще без zip, вам нужно сделать что-то вроде этого:

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

но нет никаких причин делать это, кроме интеллектуальных упражнений.

Использование map(list, zip(cities, airports)) короче, проще и почти наверняка будет работать быстрее.

4 голосов
/ 31 января 2010

Понимание списка без помощи zip, map или itertools не может создать «параллельный цикл» для нескольких последовательностей - только простые циклы в одной последовательности или «вложенные» циклы для несколькихиз них.

1 голос
/ 31 января 2010

Это берет вывод 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
0 голосов
/ 23 марта 2017

Можно использовать также enumerate:

[[y,airports[x]] for x,y in enumerate(cities)]
...