删除/合并此列表中重复项的最佳方法是?

时间:2015-08-10 13:44:47

标签: python list merge

我得到了一个像这样构建的列表:

item_list = [
    [ObjectB, 9],
    [ObjectA, 2],
    [ObjectB, 5],
    [ObjectC, 8],
    [ObjectA, 7]
]

正如您所见,ObjectA和ObjectB在此列表中是两次。左栏定义了它是哪种项目,右边是我需要它的频率。因此,我希望得到这样的结果:

item_list = [
    [ObjectB, 14],
    [ObjectA, 9],
    [ObjectC, 8],
]

[ObjectB, 9][ObjectB, 5]合并到[ObjectB, 14]ObjectA次出现也是如此。 实现这一目标的最佳方法是什么?我尝试了几种解决方案,但我觉得这是一种非常简单有效的解决方案。

2 个答案:

答案 0 :(得分:8)

显然,字典会对你的问题很方便:

d = defaultdict(int)
for k, v in item_list:  # unwrapping credits to @clemtoy
    d[k] += v
result = [[k, v] for k, v in d.iteritems()]

因此,您首先要创建一个defaultdict,使用int作为工厂方法。这意味着如果您尝试访问字典中不存在的任何键,您将获得0

接下来,您可以通过增加键的值来开始填充字典。如果密钥尚未出现在字典中,您将从0开始。

现在最终转换回你想要的结构,你需要最后一行 - 列表理解。而你的result将是:

[[ObjectA, 9], [ObjectB, 14], [ObjectC, 8]]

此外,如果你需要它,请继续:

result = sorted(result, key=itemgetter(1), reverse=True)))

这将使用每个元素的第二个子元素按降序对result进行排序。

答案 1 :(得分:1)

喜欢这个吗?

ObjectA = "hello"
ObjectB = "cruel"
ObjectC = "world"

item_list = [
    [ObjectB, 9],
    [ObjectA, 2],
    [ObjectB, 5],
    [ObjectC, 8],
    [ObjectA, 7]
]

sum = {}
for item in item_list:
    sum[item[0]] = sum.get(item[0], 0) + item[1]
print(sum)
  

{'世界':8,'残忍':14,'你好':9}