Объединить 2 списка списка в список кортежей

Я пытаюсь объединить разные вложенные списки в список кортежей (x, y) где x происходит из первого вложенного списка, а y - из второго вложенного списка.

nested_list1 = [[1, 2, 3],[3],[0, 3],[1]]
nested_list2 = [[.0833, .0833, .0833], [.2], [.175, .175], [.2]]

при их объединении должно быть:

result = [(1,.0833), (2,.0833), (3,.0833), (3,.2), (0,.175), (3,.175), (1,.2)]

Мой подход состоит в том, что мне нужно перебирать список списков и присоединяться к ним по одному. Я знаю, что нужно перебирать 1 вложенный список следующим образом:

for list in nested_list1:
    for number in list:
        print(number)

но я не могу перебирать 2 вложенных списка одновременно.

for list, list in zip(nested_list1, nested_list2):
    for number, prob in zip(list,list):
        print(tuple(number, prob)) #will not work

Любые идеи?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
166
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Сгладьте ваши списки и затем перейдите к zip():

list1 = [item for sublist in nested_list1 for item in sublist]
list2 = [item for sublist in nested_list2 for item in sublist]
final = list(zip(list1, list2))

Урожайность:

[(1, 0.0833), (2, 0.0833), (3, 0.0833), (3, 0.2), (0, 0.175), (3, 0.175), (1, 0.2)]
Ответ принят как подходящий

Вы можете сделать двойной zip через списки:

lst1 = [[1, 2, 3],[3],[0, 3],[1]]
lst2 = [[.0833, .0833, .0833], [.2], [.175, .175], [.2]]

print([(u, v) for x, y in zip(lst1, lst2) for u, v in zip(x, y)])

Или используйте itertools.chain.from_iterable для сглаживания списка и zip:

from itertools import chain

lst1 = [[1, 2, 3],[3],[0, 3],[1]]
lst2 = [[.0833, .0833, .0833], [.2], [.175, .175], [.2]]

print(list(zip(chain.from_iterable(lst1), chain.from_iterable(lst2))))

Используйте itertools.chain:

>>> nested_list1 = [[1, 2, 3],[3],[0, 3],[1]]
>>> nested_list2 = [[.0833, .0833, .0833], [.2], [.175, .175], [.2]]
>>> import itertools
>>> res = list(zip(itertools.chain.from_iterable(nested_list1), itertools.chain.from_iterable(nested_list2)))
>>> res
[(1, 0.0833), (2, 0.0833), (3, 0.0833), (3, 0.2), (0, 0.175), (3, 0.175), (1, 0.2)]
result = []
[result.extend(list(zip(x, y))) for x in nested_list1 for y in nested_list2]
print(result)

Это вернет список списка вместо одного списка.

Rocky Li 29.10.2018 16:52

Спасибо за фрагмент кода, который может оказать некоторую немедленную помощь. Правильное объяснение значительно улучшило бы его долгосрочная стоимость, объяснив, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими подобными вопросами. Измените свой ответ, чтобы добавить пояснения, включая сделанные вами предположения.

sepehr 29.10.2018 17:11

В вашем коде 2 ошибки:

  1. Вы дважды затеняете встроенный list таким образом, чтобы невозможно было различить две переменные. Не делай этого.
  2. Вы используете tuple(x, y) для создания двух переменных формы tuple. Это неверно, поскольку tuple принимает только один аргумент. Чтобы создать кортеж из двух переменных, просто используйте синтаксис (x, y).

Итак, это будет работать:

for L1, L2 in zip(nested_list1, nested_list2):
    for number, prob in zip(L1, L2):
        print((number, prob))

Более идиоматичным было бы сгладить ваши вложенные списки; например, через itertools.chain:

from itertools import chain

res = list(zip(chain.from_iterable(nested_list1),
               chain.from_iterable(nested_list2)))

[(1, 0.0833), (2, 0.0833), (3, 0.0833), (3, 0.2), (0, 0.175), (3, 0.175), (1, 0.2)]

Этот лайнер позволит достичь того, чего вы хотите.

reduce(lambda x, y: x+y, [[(i, j) for i, j in zip(x,y)] for x, y in zip(nested_list1, nested_list2)])

Один из способов - преобразовать оба вложенных списка в полные, а затем использовать zip. Пример кода ниже:

>>> nested_list1 = [[1, 2, 3],[3],[0, 3],[1]]
>>> nested_list2 = [[.0833, .0833, .0833], [.2], [.175, .175], [.2]]
>>> new_list1 = [x for val in nested_list1 for x in val]
>>> new_list2 = [x for val in nested_list2 for x in val]
>>> print new_list1
[1, 2, 3, 3, 0, 3, 1]
>>> print new_list2
[0.0833, 0.0833, 0.0833, 0.2, 0.175, 0.175, 0.2]
>>> new_val = zip(new_list1, new_list2)
>>> print new_val
[(1, 0.0833), (2, 0.0833), (3, 0.0833), (3, 0.2), (0, 0.175), (3, 0.175), (1, 0.2)]

Используйте два раза zip и сгладьте список

from functools import reduce
reduce(lambda x,y: x+y,[(zip(i,j)) for i,j in zip(nested_list1,nested_list2)])

Вы также можете сгладить, используя chain

from itertools import chain
list(chain(*[(zip(i,j)) for i,j in zip(nested_list1,nested_list2)]))

выход

[(1, 0.0833), (2, 0.0833), (3, 0.0833), (3, 0.2), (0, 0.175), (3, 0.175), (1, 0.2)]

Другие вопросы по теме