a = {'1': {'name': 'Blue', 'qty': '1'},
'2': {'name': 'Green', 'qty': '1'},
'3': {'name': 'Blue', 'qty': '1'},
'4': {'name': 'Blue', 'qty': '1'}}
b = {'1': {'name': 'Blue', 'qty': '3'},
'2': {'name': 'Green', 'qty': '1'}}
我能够排除重复的值但不能增加'qty'字段。
b = {}
for k,v in a.iteritems():
if v not in b.values():
b[k] = v
答案 0 :(得分:4)
这似乎有效:
from collections import defaultdict
result = defaultdict(lambda: 0)
# Summarize quantities for each name
for item in a.values():
result[item['name']] += int(item['qty'])
# Convert to your funny format
b = {str(i+1): v for i, v in enumerate({'name': key, 'qty': str(val)} for key, val in result.items())}
# b contains:
# {'1': {'name': 'Blue', 'qty': '3'}, '2': {'name': 'Green', 'qty': '1'}}
如果我可以选择数据结构,它可能如下所示:
from operator import add
from collections import Counter
a = [('Blue', 1), ('Green', 1), ('Blue', 1), ('Blue', 1)]
b = reduce(add, [Counter(**{x[0]: x[1]}) for x in a])
# b contains:
# Counter({'Blue': 3, 'Green': 1})
答案 1 :(得分:2)
麻烦的双线:
data = [v['name'] for v in a.values()]
b = {str(i+1): {'name': j, 'qty': data.count(j)} for i, j in enumerate(set(data))}
根据André和原始海报的评论,这是一个更复杂的解决方案。
首先,将原始字典'name'
和'sub'
密钥转换为逗号分隔字符串,以便我们可以使用set()
:
data = [','.join([v['name']]+v['sub']) for v in a.values()]
返回
['Blue,sky,ethernet cable', 'Green', 'Blue,sky,ethernet cable', 'Blue,sea']
然后使用嵌套的字典和列表推导如下:
b = {str(i+1): {'name': j.split(',')[0], 'qty': sum([int(qty['qty']) for qty in a.values() if (qty['name']==j.split(',')[0]) and (qty['sub']==j.split(',')[1:])]), 'sub': j.split(',')[1:]} for i, j in enumerate(set(data))}
希望这会有所帮助。