根据另一个列表中的重复值合并子列表

时间:2019-08-11 15:31:03

标签: python list dictionary list-comprehension

我有2个要创建字典的列表。

我的list1是:

[1,2,2,3]

我的list2是:

[['A','B'],['J','K'],[L'','M'],['W','X']]

我想做一个

dict(zip(list1,list2))

但是考虑到list1具有重复的键,我正在丢失一个键2及其值。

所以我想基于列表1中的重复值加入list2的子列表。

list1和list2的索引顺序相同。

所需的输出为:

[['A','B'],['J','K','L','M'],['W','X']]

所以我可以删除list1的副本并制作

dict(zip(list1_without_dups,list2_merged_sublists))    

对不起,我没有尝试,但是我一直在寻找类似的问题而未能成功,并且不确定如何面对它。

2 个答案:

答案 0 :(得分:4)

使用collections.defaultdict

from collections import defaultdict

lst1 = [1,2,2,3]
lst2 = [['A','B'],['J','K'],['L','M'],['W','X']]

d = defaultdict(list)

for x, y in zip(lst1, lst2):
    d[x].extend(y)

print(d)

输出:

defaultdict(<class 'list'>, {1: ['A', 'B'], 2: ['J', 'K', 'L', 'M'], 3: ['W', 'X']})

您现在可以提取值以获得所需的列表。

答案 1 :(得分:0)

您可以使用itertools.groupby

from itertools import groupby as g, chain as c
d =  [1,2,2,3]
new_d = [['A','B'],['J','K'],['L','M'],['W','X']]
r = [list(c(*[j for _, j in b])) for _, b in g(list(zip(d, new_d)), key=lambda x:x[0])]

输出:

[['A', 'B'], ['J', 'K', 'L', 'M'], ['W', 'X']]