Как объединить два вложенных списка и вывести список списков кортежей? - PullRequest
0 голосов
/ 14 марта 2019

У меня есть два вложенных списка, list_a и list_b:

list_a=[['a','b'],['c','d','e'],['f','g','f']]
list_b=[[5,7],[2,3,2],[4,7,8]]

Я пытаюсь создать list_c, который будет результатом слияния каждого элемента в list_a с соответствующим элементом в list_b, например, list_a[1][1] с list_b[1][1] и list_a[1][2] с list_b[1][2] и т. Д. .произвести список списков кортежей.

list_c=[[('a',5),('b',7)],[('c',2),('d',3),('e',2)],[('f',4),('g',7),('f',8)]]

Я уже пробовал:

list_c=[]
for list1 in list_a:
    for list2 in list_b:
        list_c.append(list(zip(list1,list2)))

Но вывод для этого - список списков кортежей всех возможных комбинаций элементов в исходных списках:

[[('a', 5), ('b', 7)], [('a', 2), ('b', 3)], 
 [('a', 4), ('b', 7)], [('c', 5), ('d', 7)],...
 [('f', 2), ('g', 3), ('f', 2)], 
 [('f', 4), ('g', 7), ('f', 8)]]

Я чувствую, что близок к правильному ответу, но упускаю что-то простое. Как мне получить list_c структуры, которую я ищу? (Сохранение порядка имеет значение, поскольку я хотел бы использовать это для работы с CSV-файлом)

Это расширение вопроса, задаваемого здесь: Объединить элементы в двух вложенных списках в пары в кортежах

Но я не смог найти ни одного подобного вопроса, который бы не сводил полученный список к чему-то вроде:

list_c=[('a',5),('b',7),('c',2),('d',3),('e',2),('f',4),('g',7),('f',8)]

Ответы [ 4 ]

3 голосов
/ 14 марта 2019

Вам нужно zip над list_a и list_b, а не делать вложенный цикл for (продукт): что-то с эффектом:

[list(zip(a,b)) for a,b in zip(list_a, list_b)]

Другими словами:

result = []
for a, b in zip(list_a, list_b):
    result.append(list(zip(a,b)))
0 голосов
/ 14 марта 2019

Так как лучший и более короткий метод уже взят .., другой вариант со старым добрым многословным для цикла:

list_c = []
for i, a in enumerate(list_a):
  tmp = []
  for j, b in enumerate(list_b[i]):
    tmp.append((a[j], b))
  list_c.append(tmp)

list_c
#=> [[('a', 5), ('b', 7)], [('c', 2), ('d', 3), ('e', 2)], [('f', 4), ('g', 7), ('f', 8)]]
0 голосов
/ 14 марта 2019
list_c = []
for i, element_a in enumerate(list_a):
    element_b = list_b[i]
    merged_list = []
    for j in range(len(element_a)):
        merged_list.append((element_a[j], element_b[j]))
    list_c.append(merged_list)

Создать новый кортеж для каждого элемента в каждом индексе списка и добавить в основной список

0 голосов
/ 14 марта 2019

с использованием списка

a=[['a','b'],['c','d','e'],['f','g','f']]
b=[[5,7],[2,3,2],[4,7,8]]

c = [list(zip(i,j)) for i,j in zip(a,b)]

print(c)

"""
output 


[[('a', 5), ('b', 7)],
 [('c', 2), ('d', 3), ('e', 2)],
 [('f', 4), ('g', 7), ('f', 8)]]

"""

с использованием лямбда-функции это можно сделать как

d=list(map(lambda x,y:list(zip(x,y)),a,b))
print(d) 
"""
output 

[[('a', 5), ('b', 7)],
 [('c', 2), ('d', 3), ('e', 2)],
 [('f', 4), ('g', 7), ('f', 8)]]

"""
...