Мне нужно объединить элементы подсписка в Python - PullRequest
0 голосов
/ 09 февраля 2019

у меня есть следующие списки данных

data1 = [[4,5,9],[4,7,2],[11,13,15]]
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]

я хочу, чтобы объединение списка было выполнено следующим образом.

data = [[4,5,9,1,2,3,7], [4,7,2,3,6,8,5], [11,13,15,12,10,15,17]]

т.е. объединение элементов с индексом 0 в data1 и data2 иобъединение элементов с индексом 1 в data1 и data 2 и т. д.

data1 = [[4,5,9],[4,7,2],[11,13,15]]
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]
for i in range (0,2):
    for j in range(0,3):
        data1[i].extend(data2[j])
print(data1)

Ответы [ 5 ]

0 голосов
/ 09 февраля 2019

Вы можете использовать оператор concat() и функцию starmap();:

from operator import concat
from itertools import starmap

list(starmap(concat, zip(data1, data2)))
# [[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]
0 голосов
/ 09 февраля 2019

Если вы уверены, что data1 и data2 всегда имеют одинаковое количество элементов (подсписков), вы можете использовать map следующим образом:

data1 = [[4,5,9],[4,7,2],[11,13,15]]
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]
data = list(map(lambda x,y:x+y,data1,data2))
print(data)

вывод:

[[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]
0 голосов
/ 09 февраля 2019

Попробуйте следующее:

data_to_merge = [data1,data2]
merged = [sum(ds,[]) for ds in zip(*data_to_merge)]

Вы также можете использовать numpy's hstack, который я считаю более интуитивным

merged = np.hstack(data_to_merge)
0 голосов
/ 09 февраля 2019

Я сравнил решения, приведенные в других ответах:

def f1(original_data):
    return [
        x+y
        for x, y in zip(*original_data)]

def f2(original_data):
    return [
        sum(x, [])
        for x in zip(*original_data)]

def f3(original_data):
    data_1 = original_data[0]
    data_2 = original_data[1]

    for i in range(len(data_1)):
        data_1[i].extend(data_2[i])

    return data_1

def f4(original_data):
    return np.hstack(original_data).tolist()

И время:

>>> import timeit
>>> timeit.timeit('f(data)', 'from __main__ import data,  f1 as f')
0.6496335420088144
>>> timeit.timeit('f(data)', 'from __main__ import data,  f2 as f')
1.1647848110005725
>>> timeit.timeit('f(data)', 'from __main__ import data,  f3 as f')
0.6762638779910048
>>> timeit.timeit('f(data)', 'from __main__ import data,  f4 as f')
8.561359490995528

Версия в моем f1(), кажется, самая быстрая для этих короткихlists.

Примечание: будьте осторожны с кодом в f3(), потому что он изменяет исходные данные, поэтому вы должны запустить их как последние;другие функции возвращают новую копию и не касаются оригинала.

Одно отличие состоит в том, что версия в f2() работает для нескольких списков, а не только для 2;но это медленнее.f4() (с использованием numpy) также работает для нескольких списков, но намного медленнее.

0 голосов
/ 09 февраля 2019

Используйте zip() со списком:

data1 = [[4,5,9],[4,7,2],[11,13,15]] 
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]

data = [x+y for x, y in zip(data1, data2)]
# [[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]


Если вам это нужно обычным образом, вы можете избавиться от одного цикла в вашем коде (при условии, что оба списка равныдлина):
data1 = [[4,5,9],[4,7,2],[11,13,15]]
data2 = [[1,2,3,7],[3,6,8,5],[12,10,15,17]]

for i in range(len(data1)):
    data1[i].extend(data2[i])

print(data1)
# [[4, 5, 9, 1, 2, 3, 7], [4, 7, 2, 3, 6, 8, 5], [11, 13, 15, 12, 10, 15, 17]]
...