在Python中将两个多维列表合并成一个列表

4

我有两个列表:

a_list = 
[['2017-06-03 23:01:49', 0], ['2017-06-03 23:02:49', 712.32], ['2017-06-03 23:03:49', 501.21].......]

b_list = 
[['2017-06-03 23:01:49', 100.01], ['2017-06-03 23:02:49', 50.01], ['2017-06-03 23:03:49', 521.79].......]

我需要将a_listb_list合并成以下形式:
combined_list =
[['2017-06-03 23:01:49', 0, 100,01], ['2017-06-03 23:02:49', 712.32, 50.01], ['2017-06-03 23:03:49', 501.21, 521.79].......]

我该如何实现这个目标?
7个回答

2
a_list = [['2017-06-03 23:01:49', 0], ['2017-06-03 23:02:49', 712.32], ['2017-06-03 23:03:49', 501.21]]
b_list = [['2017-06-03 23:01:49', 100.01], ['2017-06-03 23:02:49', 50.01], ['2017-06-03 23:03:49', 521.79]]

假设a_listb_list长度相同,并且假设两个列表中每个项目的第一个子项始终相同,就像您的示例一样,解决方案可以在一行代码中完成。
>>> [a + [b[1]] for (a, b) in zip(a_list, b_list)]
[[['2017-06-03 23:01:49', 0, 100.01]], [['2017-06-03 23:02:49', 712.32, 50.01]], [['2017-06-03 23:03:49', 501.21, 521.79]]]

非常感谢@A-B-B,这个方法很有效。但是,如果我有第三个列表要添加,就像这样:c_list = [['2017-06-03 23:01:49',1.5],['2017-06-03 23:02:49',10.3],['2017-06-03 23:03:49',11.1]]。我做了这个:[a + [b [1] + [c [1]] for(a,b,c)in zip(a_list,b_list,c_list)]。我收到错误消息“zip argument #3 must support iteration”。我在这里做错了什么?谢谢! - coding
@coding 使用[a + [b[1]] +[c[1]] for (a, b, c) in zip(a_list, b_list, c_list)]。这对我很有效。确保c_lista_listb_list一样是一个列表。为了理解zip的工作原理,请尝试list(zip(range(5,10), range(10,15), range(15,20))) - Asclepius

2
你可以使用zip()list comprehension来解包数据,像这个例子一样:
a = [['2017-06-03 23:01:49', 0],
 ['2017-06-03 23:02:49', 712.32],
 ['2017-06-03 23:03:49', 501.21]]

b = [['2017-06-03 23:01:49', 100.01],
 ['2017-06-03 23:02:49', 50.01],
 ['2017-06-03 23:03:49', 521.79]]

final = [[k,v,j] for (k,v),(_,j) in zip(a, b)]
print(final)

输出:

[['2017-06-03 23:01:49', 0, 100.01],
 ['2017-06-03 23:02:49', 712.32, 50.01],
 ['2017-06-03 23:03:49', 501.21, 521.79]]

1
尝试使用此方法,合并两个列表,然后使用defaultdict生成新的字典,查找相同的键,将值附加到super_dict,然后将字典转换为列表格式:
import collections
a_list = [['2017-06-03 23:01:49', 0], ['2017-06-03 23:02:49', 712.32], ['2017-06-03 23:03:49', 501.21]]
b_list = [['2017-06-03 23:01:49', 100.01], ['2017-06-03 23:02:49', 50.01], ['2017-06-03 23:03:49', 521.79]]
super_dict = collections.defaultdict(list)

for e in a_list+b_list:
    super_dict[e[0]].append(e[1])

dictlist=list()
for key, value in super_dict.iteritems():
    dictlist.append([key]+value)
dictlist

输出:

[['2017-06-03 23:02:49', 712.32, 50.01],
 ['2017-06-03 23:03:49', 501.21, 521.79],
 ['2017-06-03 23:01:49', 0, 100.01]]

要获得所需的输出,您可以执行 [key] + value,这也允许将其放入列表推导式中。 - Copperfield

0
下面的代码应该可以工作。思路是你想要取一个列表a,并创建一个字典,其中键设置为a中每个子列表的第一个元素。与该列表相关联的值是包含a中该子列表的第二个元素的列表。然后我们循环遍历第二个列表b并执行相同的操作。最后,我们迭代创建的字典D,并将其转换为列表。
a = [[1,2], [3,4], [5,6]]
b = [[1,20],[3,40],[5, 50]]
D = {}
for i in a:
    D[i[0]] = [i[1]]

for i in b:
    D[i[0]].append(i[1])

finalList = []
for d in D:
    finalList.append([d, D[d][0], D[d][1]])

print(finalList)
>>> [[1, 2, 10], [3, 4, 40], [5, 6, 50]]

请注意,此程序假定两个相应的子列表保证具有相等的第一个元素。如果不是这种情况或者两个列表a和b不相等,则需要在第8行上使用if语句来检查键值i[0]是否在列表中。

0

只是把我的尝试加入到混合中:

list1 = [["a","b"],["c","d"]]
list2 = [["a","1"],["c","2"]]
list3 = [(sub + [list2[i][-1]]) for i, sub in enumerate(list1)]
#[['a', 'b', '1'], ['c', 'd', '2']]

这与@A-B-B的代码非常接近,但如果使用zip函数,则可以使用enumerate。


这个不正确地工作,例如尝试使用 list2 = [["a","11"],["c","22"]] - Copperfield

0
a_list = [['2017-06-03 23:01:49', 0], ['2017-06-03 23:02:49', 712.32], ['2017-06-03 23:03:49', 501.21]]

b_list = [['2017-06-03 23:01:49', 100.01], ['2017-06-03 23:02:49', 50.01], ['2017-06-03 23:03:49', 521.79]]

combined_list = []
for index in range(3):
    x = a_list[index] + b_list[index]
    x.pop(2)
    combined_list.append(x)
print(combined_list)    

我使用了通过索引循环和使用pop函数来删除出现多次的项的想法。代码输出了您所需的结果。 - joshua

0
如果你正在寻找一行代码,那么我想我可以试着给出一个。
[set(item[0]).union(item[1]) for item in list(zip(a_list, b_list))]
>>>[{0, 100.01000000000001, '2017-06-03 23:01:49'}, {'2017-06-03 23:02:49', 50.009999999999998, 712.32000000000005}, {521.78999999999996, 501.20999999999998, '2017-06-03 23:03:49'}]
>>>

结果将是一个集合。不会有任何元素的重复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接