Ответ 1
Если вы запишете более 2 списков (или даже только 2, если на то пошло), читаемым способом будет:
[list(a) for a in zip([1,2,3], [4,5,6], [7,8,9])]
Это использует списки и преобразует каждый элемент в список (кортежи) в списки.
Каков самый быстрый и элегантный способ сделать список списков из двух списков?
У меня
In [1]: a=[1,2,3,4,5,6]
In [2]: b=[7,8,9,10,11,12]
In [3]: zip(a,b)
Out[3]: [(1, 7), (2, 8), (3, 9), (4, 10), (5, 11), (6, 12)]
И я хотел бы иметь
In [3]: some_method(a,b)
Out[3]: [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, 12]]
Я думал об использовании карты вместо zip, но я не знаю, есть ли какой-то стандартный библиотечный метод для размещения в качестве первого аргумента.
Я могу определить свою собственную функцию для этого и использовать карту, мой вопрос в том, что что-то уже реализовано. Нет также является ответом.
Если вы запишете более 2 списков (или даже только 2, если на то пошло), читаемым способом будет:
[list(a) for a in zip([1,2,3], [4,5,6], [7,8,9])]
Это использует списки и преобразует каждый элемент в список (кортежи) в списки.
Мне нравится элегантность функции zip, но использование функции itemgetter() в операционном модуле выглядит намного быстрее. Я написал простой script, чтобы проверить это:
import time
from operator import itemgetter
list1 = list()
list2 = list()
origlist = list()
for i in range (1,5000000):
t = (i, 2*i)
origlist.append(t)
print "Using zip"
starttime = time.time()
list1, list2 = map(list, zip(*origlist))
elapsed = time.time()-starttime
print elapsed
print "Using itemgetter"
starttime = time.time()
list1 = map(itemgetter(0),origlist)
list2 = map(itemgetter(1),origlist)
elapsed = time.time()-starttime
print elapsed
Я ожидал, что zip будет быстрее, но метод itemgetter победит длинным выстрелом:
Using zip
6.1550450325
Using itemgetter
0.768098831177
У вас почти был ответ. Не используйте map
вместо zip
. Используйте map
И zip
.
Вы можете использовать карту вместе с zip для элегантного функционального подхода:
map(list, zip(a, b))
zip
возвращает список кортежей. map(list, [...])
вызывает list
для каждого кортежа в списке.
Мне вообще не нравится использовать лямбда, но...
>>> a = [1, 2, 3, 4, 5]
>>> b = [6, 7, 8, 9, 10]
>>> c = lambda a, b: [list(c) for c in zip(a, b)]
>>> c(a, b)
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
Если вам нужна дополнительная скорость, карта немного быстрее:
>>> d = lambda a, b: map(list, zip(a, b))
>>> d(a, b)
[[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
Однако карта считается непитонической и должна использоваться только для настройки производительности.
Как насчет этого?
>>> def list_(*args): return list(args)
>>> map(list_, range(5), range(9,4,-1))
[[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]
Или даже лучше:
>>> def zip_(*args): return map(list_, *args)
>>> zip_(range(5), range(9,4,-1))
[[0, 9], [1, 8], [2, 7], [3, 6], [4, 5]]
Понимание списка было бы очень простым решением, я думаю.
a=[1,2,3,4,5,6]
b=[7,8,9,10,11,12]
x = [[i, j] for i, j in zip(a,b)]
print(x)
output : [[1, 7], [2, 8], [3, 9], [4, 10], [5, 11], [6, 12]]