2013-12-08 2 views
0

У меня есть три списка, которые содержат позиции x, y и z. Например:объединение списков: три списка в один новый список

x = [10,20,1] 
y = [10,15,2] 
z = [12,23,3] 

Я хочу, чтобы создать список, используя их, что выглядит как:

xyz = [[10,10,12], [20,15,23], [1,2,3]] 

Эти списки огромные (1 млн записей). Что такое хороший способ сделать это?

Спасибо!

+0

Если вам не нужно получить доступ ко всем значениям, я бы предложил не создавать фактический список, а создать функцию доступа, которая строит координированные тройки по требованию? – user1781290

+0

Спасибо за вашу идею, но мне нужно получить доступ ко всем значениям, и поэтому мне нужен список списков. –

ответ

4

Вы ищете встроено функции zip:

>>> x = [10,20,1] 
>>> y = [10,15,2] 
>>> z = [12,23,3] 
>>> zip(x, y, z) 
[(10, 10, 12), (20, 15, 23), (1, 2, 3)] 

Это создает список кортежей. Если вы абсолютно необходимо список списков, принуждать те кортежи вручную:

>>> [list(t) for t in zip(x, y, z)] 
[[10, 10, 12], [20, 15, 23], [1, 2, 3]] 

Обратите внимание, что в Python 3, zip возвращает ленивый итератор вместо списка (так же, как itertools.izip в Python 2). Если ваши списки такие большие, что может быть предпочтительнее, но помните, что итераторы не являются подстраницами.

+0

Спасибо. Мне нужен список списков. Время для меня сущее. Я попробовал ваш код, и он работает. Хотя я ищу что-то быстрое и не нуждается в промежуточном шаге (здесь конвертируем в кортеж). –

2

Для Python 2.x можно использовать izip:

from itertools import izip 

for a,b,c in izip(x,y,z): 
    # do something 

This итерацию через списки вместо копирования своих данных.

0

Это ручной способ сделать это (если вы заинтересованы):

>>> xyz = [] 
>>> x = [10, 20, 1] 
>>> y = [10, 15, 2] 
>>> z = [12, 23, 3] 
>>> 
>>> for num in range(3): #Change 3 to however many numbers u want 
...  xyz.append([x[num], y[num], z[num]]) 
... 
>>> print xyz 
[[10, 10, 12], [20, 15, 23], [1, 2, 3]] 

Надеется, что это помогает!

+1

На большей части этой страницы было бы неплохо добавить «assert len ​​(x) == len (y) и len (y) == len (z)» и/или использовать zip_longest(). Кроме того, в 2.x izip иногда лучше, чем zip, хотя в 3.x zip это путь. – dstromberg

+0

Согласовано. Они определенно должны иметь одинаковые длины. Я просто подумал, что этот маршрут будет интересен, потому что он несколько ручной по сравнению с zip. – tabchas

Смежные вопросы