从列表列表中选择重复列表(Python 2.7.13)

时间:2017-03-14 12:19:50

标签: python-2.7

我有两个列表,一个是列表列表,它们具有相同数量的索引(值的一半),如下所示:

list1=[['47', '43'], ['299', '295'], ['47', '43'], etc.]
list2=[[9.649, 9.612, 9.42, etc.]

我想检测同一列表中的重复值对(并删除它),并在第二个列表中对具有相同索引的值求和,创建如下输出:

list1=[['47', '43'], ['299', '295'], etc.]
list2=[[19.069, 9.612, etc.]

主要问题是值的顺序很重要,而且我真的卡住了。

1 个答案:

答案 0 :(得分:0)

您可以创建一个collections.defaultdict来将值汇总在一起,将键作为子列表(转换为tuple可以清除)

list1=[['47', '43'], ['299', '295'], ['47', '43']]
list2=[9.649, 9.612, 9.42]

import collections

c = collections.defaultdict(float)

for l,v in zip(list1,list2):
    c[tuple(l)] += v

print(c)

替代方案使用collections.Counter并执行相同的操作:

c = collections.Counter((tuple(k),v) for k,v in zip(list1,list2))

此时,我们有相关数据:

defaultdict(<class 'float'>, {('299', '295'): 9.612, ('47', '43'): 19.069})

现在如果需要(不确定,因为字典很好地保存了数据)我们可以重建列表,保持它们之间的(相对)顺序(但不是它们的原始顺序,这不应该是一个问题,因为他们仍然联系在一起):

list1=[]
list2=[]

for k,v in c.items():
    list1.append(list(k))
    list2.append(v)

print(list1,list2)

结果:

[['299', '295'], ['47', '43']]
[9.612, 19.069]