Объединить список кортежей поэлементно и преобразовать его в список списков - PullRequest
2 голосов
/ 19 июня 2020

У меня есть список результатов, которые выглядят так:

list_results=[([{"A"}], [], [], [1]), ([{"B"}], [], [23], []), ([{"C"}], [55], [], []), ([{"D"}], [422], [], [])] # a list of 4 tuples

И я хочу объединить каждый элемент кортежа и получить следующий результат:

merged_list=[[{"A"}, {"B"}, {"C"}, {"D"}], [55, 422], [23], [1]] # a list of lists

list1=merged_list[0] #[{"A"}, {"B"}, {"C"}, {"D"}]
list2=merged_list[1] #[55, 422]
list3=merged_list[2] #[23]
list4=merged_list[3] #[1]

(НЕОБЯЗАТЕЛЬНО ) Пожалуйста, предложите решения, эффективные с точки зрения кода и времени, потому что это преобразование будет включать более 4 кортежей (т.е. 100 000 кортежей)

Заранее благодарим вас за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

Вы можете zip элементы списка вместе и использовать itertools, чтобы связать / сгладить результат в рамках понимания списка.

>>> import itertools
>>> [list(itertools.chain.from_iterable(i)) for i in zip(*list_results)]
[[{'A'}, {'B'}, {'C'}, {'D'}], [55, 422], [23], [1]]
1 голос
/ 19 июня 2020

Вы можете использовать chain.from_iterable():

from itertools import chain

merged_list = list(map(list, map(chain.from_iterable, zip(*list_results))))
0 голосов
/ 19 июня 2020
def merge(ls):
    result=[]
    ls0=[]
    ls1=[]
    ls2=[]
    ls3=[]
    for index in range(len(ls)):
        ls0.append(ls[index][0][0])
        try:
            ls1.append(ls[index][1][0])
        except:
            pass
        try:
            ls2.append(ls[index][2][0])
        except:
            pass
        try:
            ls3.append(ls[index][3][0])
        except:
            pass
    result.append(ls0)
    result.append(ls1)
    result.append(ls2)
    result.append(ls3)
    return result

Надеюсь, это сработает для вас.

без использования itertools

  • installli sh 4 списка
  • попытка, за исключением того, чтобы избежать добавления пустые элементы
...