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

Exc*_*een 2 python merge list

我有一个这样建立的列表:

item_list = [
    [ObjectB, 9],
    [ObjectA, 2],
    [ObjectB, 5],
    [ObjectC, 8],
    [ObjectA, 7]
]
Run Code Online (Sandbox Code Playgroud)

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

item_list = [
    [ObjectB, 14],
    [ObjectA, 9],
    [ObjectC, 8],
]
Run Code Online (Sandbox Code Playgroud)

[ObjectB, 9]并且[ObjectB, 5]合并在一起[ObjectB, 14],所以ObjectA发生了.实现这一目标的最佳方法是什么?我尝试了几种解决方案,但我觉得这是一种非常简单有效的解决方案.

bag*_*rat 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()]
Run Code Online (Sandbox Code Playgroud)

所以你首先要做的是创建一个defaultdict,int用作工厂方法.这意味着如果您尝试访问字典中不存在的任何键,您将获得0.

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

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

[[ObjectA, 9], [ObjectB, 14], [ObjectC, 8]]
Run Code Online (Sandbox Code Playgroud)

而且,如果你需要它排序,请继续:

result = sorted(result, key=itemgetter(1), reverse=True)))
Run Code Online (Sandbox Code Playgroud)

这将result使用每个元素的第二个子元素按降序排序.