我需要在 python 中合并子列表的元素
I need to merge elements of sublist in python
我有以下数据列表
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]]
即合并 data1 和 data2 中索引 0 处的元素,合并 data1 和 data 2 中索引 1 处的元素,依此类推。
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)
将 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]]
尝试以下操作:
data_to_merge = [data1,data2]
merged = [sum(ds,[]) for ds in zip(*data_to_merge)]
你也可以使用 numpy 的 hstack
,我觉得它更直观一些
merged = np.hstack(data_to_merge)
我对比了其他答案给出的方案:
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()
中的版本似乎是这些短列表中最快的。
注意:f3()
中的代码要小心,因为它修改了原始数据,所以你必须运行它作为最后一个;其他功能 return 一个新的副本,不要触及原件。
一个区别是,f2()
中的版本适用于多个列表,而不仅仅是 2 个;但速度较慢。 f4()
(使用 numpy
)也适用于多个列表,但速度要慢很多。
如果您确定 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]]
您可以使用运算符 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]]
我有以下数据列表
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]]
即合并 data1 和 data2 中索引 0 处的元素,合并 data1 和 data 2 中索引 1 处的元素,依此类推。
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)
将 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]]
尝试以下操作:
data_to_merge = [data1,data2]
merged = [sum(ds,[]) for ds in zip(*data_to_merge)]
你也可以使用 numpy 的 hstack
,我觉得它更直观一些
merged = np.hstack(data_to_merge)
我对比了其他答案给出的方案:
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()
中的版本似乎是这些短列表中最快的。
注意:f3()
中的代码要小心,因为它修改了原始数据,所以你必须运行它作为最后一个;其他功能 return 一个新的副本,不要触及原件。
一个区别是,f2()
中的版本适用于多个列表,而不仅仅是 2 个;但速度较慢。 f4()
(使用 numpy
)也适用于多个列表,但速度要慢很多。
如果您确定 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]]
您可以使用运算符 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]]