我有一个这样建立的列表:
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发生了.实现这一目标的最佳方法是什么?我尝试了几种解决方案,但我觉得这是一种非常简单有效的解决方案.
显然,字典会对你的问题很方便:
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使用每个元素的第二个子元素按降序排序.
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |