我得到了一个像这样构建的列表:
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
次出现也是如此。
实现这一目标的最佳方法是什么?我尝试了几种解决方案,但我觉得这是一种非常简单有效的解决方案。
答案 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}