Как объединить N нескольких списков в один большой список? - PullRequest
2 голосов
/ 17 июня 2019

У меня есть n мульти-списки. Я хочу объединить их в один большой мульти-список. Пример:

   listA =  [[1,2],[3,4],[6,7]]
   listB =  [[10,20],[30,40],[60,70]]

Выход:

  listAB = [[1,2,10,20],[3,4,30,40],[6,7,60,70]]

Это код, который я написал, который вычисляет выше:

listAB,tmp = [],[]
for i in range(len(listA)):
    for j in range(len(listA[i])):
        tmp.append(listA[i][j])
        tmp.append(listB[i][j])
    listAB.append(tmp)
    tmp = []

Этот код работает, только если у вас есть два списка, а подсписок имеет одинаковую длину. Я хочу объединить несколько мультисписков, которые имеют разную длину подсписков. Есть ли в itertools какая-нибудь функция, которая может это сделать?

Например:

   listA =  [[1,2,3],[3,4,5],[6,7,8]]
   listB =  [[10,20],[30,40],[60,70]]
   listC =  [[4,4],[5,5],[6]]

   listABC = [[1,2,3,10,20,4,4],
              [3,4,5,30,40,5,5],
              [6,7,8,60,70,6]]

Ответы [ 3 ]

6 голосов
/ 17 июня 2019

zip списки вместе и использование itertools.chain для объединения выходных кортежей:

from itertools import chain

listABC = [list(chain.from_iterable(i)) for i in zip(listA, listB, listC)]

Вывод:

[[1, 2, 3, 10, 20, 4, 4], [3, 4, 5, 30, 40, 5, 5], [6, 7, 8, 60, 70, 6]]

Хотя непосредственное добавление списков проще для 3 входовПри таком подходе вы также можете передать произвольное количество списков , используя оператор звезды:

# this can also be a tuple or any iterable
list_of_lists = [listA, listB, listC, listD ... ]

[list(chain.from_iterable(i)) for i in zip(*list_of_lists)]

ОБНОВЛЕНИЕ: альтернативное решение ( не рекомендуется ) используя functools вместо itertools (согласно обсуждению с ReblochonMasque):

from functools import reduce

[reduce(lambda x,y: x+y, i) for i in zip(listA, listB, listC)]
4 голосов
/ 17 июня 2019

Для двух последовательностей вы можете добавить их в список понимания:

[a+b for a, b in zip(A, B)]

Для более чем двух ответов @meowgoesthedog подходит.
Если по каким-либо причинам вы не можете использовать itertools, возможно, вы могли бы сделать так:

def merge(seq1, seq2):
    return (a+b for a, b in zip(seq1, seq2))

def merge_all(s):
    res = merge(s[0], s[1])
    for sn in s[2:]:
        res = merge(res, sn)
    return list(res)

A =  [[1,2],[3,4],[6,7]]
B =  [[10,20],[30,40],[60,70]]
C =  [[4,4],[5,5],[6]]

seq = [A, B, C]
merge_all(seq)
1 голос
/ 17 июня 2019

Я полагаю, что вы можете объединить несколько мультисписков, которые имеют разную длину подсписков, просто с помощью некоторого простого кода без использования любого itertools:

listCom = []
for n in range(len(listA)):
    listCom.append(listA[n] + listB[n] + listC[n])
listCom

Вывод:

[[1, 2, 3, 10, 20, 4, 4], [3, 4, 5, 30, 40, 5, 5], [6, 7, 8, 60, 70, 6]]
...