2015-12-11 3 views
-1

у меня есть два списка списков, как это:Создать список списков из двух списков списков

[[0,3,5],['cat','dog','chicken'], [15,14,11]] 
[[1,2,4],['whale', 'rabbit', 'zebra'], [10,9,22]] 

Как, из-за этого, создать список списков:

[[0,1,2,3,4,5], ['cat', 'whale', 'rabbit','dog','zebra','chicken'], [15,10,9,14,22,11]] 

Редактировать Просто уточнить, какой результат мне нужен - список списков, отсортированных по первому списку.

+1

Что вы уже пробовали? Что не работает? Данные выглядят как список записей 'Foo (id, name, another_integer_field)'. Все, что вам нужно, - это собрать данные в список 'Foo', order by 'id', а затем преобразовать в один список. Однако этот подход может также зависеть от размера данных. – soon

+0

Я сделал это ... но это соответствует только этому конкретному вопросу. Я имею в виду, что он не обобщен – bholagabbar

+0

@GriMel делает мой ответ для вас? – bholagabbar

ответ

0

Вот как это сделать. Работает именно так, как вы хотите. Логика заключается в том, что на первой итерации элементы берутся с 'l1', а затем l2. В двух других, это l2 следует l1:

l1=[[0,3,5],['cat','dog','chicken'], [15,14,11]] 
l2=[[1,2,4],['whale', 'rabbit', 'zebra'], [10,9,22]] 
l3=[[],[],[]] 
for i in range (3): 
    for j in range(3): 
     if(j==0): 
      l3[i].append(l1[i][j]) 
      l3[i].append(l2[i][j]) 
     else: 
      l3[i].append(l2[i][j]) 
      l3[i].append(l1[i][j]) 
print(l3) 



Выход: [[0,1,2,3,4,5], ['cat', 'whale', 'rabbit','dog','zebra','chicken'], [15,10,9,14,22,11]]

Код в действии: http://ideone.com/jIlAeK

-2

Заканчивать этот сценарий, он работал для меня

list_1 = [[0,3,5],['cat','dog','chicken'], [15,14,11]] 
list_2 = [[1,2,4],['whale', 'rabbit', 'zebra'], [10,9,22]] 

list_3 = [] 

for i in range(len(list_1)): 
    list_3.append(list_1[i] + list_2[i]) 

print(list_3) 
+0

Выходы '[[0, 3, 5, 1, 2, 4] ...' вместо '[[0, 1, 2, 3, 4, 5] ...' – soon

+0

Я предположил, что сортировка результатов не была важно, до его редактирования –

0

Это должно сделать трюк:

In [30]: l1 = [[0,3,5],['cat','dog','chicken'], [15,14,11]] 

In [31]: l2 = [[1,2,4],['whale', 'rabbit', 'zebra'], [10,9,22]] 

In [32]: from operator import itemgetter 

In [33]: import itertools 

In [37]: list(zip(*sorted(itertools.chain(zip(*l1), zip(*l2)), key=itemgetter(0)))) 
Out[37]: 
[(0, 1, 2, 3, 4, 5), 
('cat', 'whale', 'rabbit', 'dog', 'zebra', 'chicken'), 
(15, 10, 9, 14, 22, 11)] 

In [39]: list(map(list, zip(*sorted(itertools.chain(zip(*l1), zip(*l2)), key=itemgetter(0))))) 

Out[39]: 
[[0, 1, 2, 3, 4, 5], 
['cat', 'whale', 'rabbit', 'dog', 'zebra', 'chicken'], 
[15, 10, 9, 14, 22, 11]] 

Пояснения:

  1. zip(*l) собирает свой список в список кортежей. Каждый кортеж содержит три элемента: (id, name, some_integer_field). Пример:

    In [35]: list(itertools.chain(zip(*l1), zip(*l2))) 
    Out[35]: 
    [(0, 'cat', 15), 
    (3, 'dog', 14), 
    (5, 'chicken', 11), 
    (1, 'whale', 10), 
    (2, 'rabbit', 9), 
    (4, 'zebra', 22)] 
    
  2. Кортежи должны быть отсортированы по первому элементу - это причина для sorted(..., key=operator.itemgetter(0))

  3. Затем он должен быть собран в одном списке. Еще один звонок zip.

  4. К сожалению, zip возвращает список кортежей.Когда вам нужен список списков, вы должны обернуть результат в zip с вызовом map(list, ...)

+0

@ShreyansSheth Так как, когда две строки слишком длинны и сложны? – percusse

+0

Это сложно, потому что на первый взгляд не ясно. Плюс импорт, и слишком много системных функций. Зачем запутывать его без необходимости? – bholagabbar

+0

@ShreyansSheth, Просто не успел добавить объяснений. Исправлено сейчас – soon

0

С сжатия списка нужно просто 1 строку кода

аа = [[0,3,5] , ['cat', 'dog', 'chicken'], [15,14,11]]

bb = [[1,2,4], ['whale', 'rabbit', 'zebra' ], [10,9,22]]

new_list = [а + Ь для а, б, в почтовый индекс (AA, BB)]

print new_list

[[0, 3, 5, 1, 2, 4], ['cat', 'dog', 'chicken', 'whale', 'rabbit', 'zebra'], [15 , 14, 11, 10, 9, 22]]

0

Используя первую запись в списках в качестве индексов сортировки, следующий сценарий даст вам ваш ожидаемый результат:

list_1 = [[0, 3, 5], ['cat','dog','chicken'], [15, 14, 11]] 
list_2 = [[1, 2, 4], ['whale', 'rabbit', 'zebra'], [10, 9, 22]] 

sort_order = list_1[0] + list_2[0] 
output = [] 

for i1, i2 in zip(list_1, list_2): 
    source = i1 + i2 
    entry = [None] * len(source) 

    for i, v in enumerate(source): 
     entry[sort_order[i]] = v 

    output.append(entry) 

print output 

Это покажет следующее :

[[0, 1, 2, 3, 4, 5], ['cat', 'whale', 'rabbit', 'dog', 'zebra', 'chicken'], [15, 10, 9, 14, 22, 11]] 
0

Всего требуется несколько строк:

>>> a = [[0,3,5],['cat','dog','chicken'], [15,14,11]] 
>>> b = [[1,2,4],['whale', 'rabbit', 'zebra'], [10,9,22]] 
>>> the_list = [c+d for c, d, in zip(a,b)] 
>>> print the_list 
[[0, 3, 5, 1, 2, 4], ['cat', 'dog', 'chicken', 'whale', 'rabbit', 'zebra'], [15, 14, 11, 10, 9, 22]] 
>>> the_list[0].sort() 
>>> print the_list 
[[0, 1, 2, 3, 4, 5], ['cat', 'dog', 'chicken', 'whale', 'rabbit', 'zebra'], [15, 14, 11, 10, 9, 22]] 
+0

Это не ответ, потому что все списки подключены.Система id = 0, name = 'cat', counts = 15. – GriMel

0

Это решение работает для неуказанного количества списков в списке верхнего уровня. После объединения двух входных списков они сортируются на основе первых значений списка:

a = [[0,3,5],['cat','dog','chicken'], [15,14,11]] 
b = [[1,2,4],['whale', 'rabbit', 'zebra'], [10,9,22]] 
combined = list(zip(*a)) + list(zip(*b)) # create tuples with an element from each sublist then merge them 
ordered_tuples = sorted(combined) # or more explicitly: sorted(combined, key=lambda x: x[0]) 
output = list(zip(*ordered_tuples)) # this reverses the sorted tuples into lists as requested 
Смежные вопросы