从字典中排除重复值并相应地增加“数量”字段

时间:2015-01-20 15:37:38

标签: python dictionary

考虑'1','2','3','4'是索引,其他一切都是Python中字典的值,我试图排除重复值并增加数量字段找到了复制品。 e.g:

转过来:

a = {'1': {'name': 'Blue', 'qty': '1', 'sub': ['sky', 'ethernet cable']},
     '2': {'name': 'Blue', 'qty': '1', 'sub': ['sky', 'ethernet cable']},
     '3': {'name': 'Green', 'qty': '1', 'sub': []},
     '4': {'name': 'Blue', 'qty': '1', 'sub': ['sea']}}

进入:

b = {'1': {'name': 'Blue', 'qty': '2', 'sub': ['sky', 'ethernet cable']},
     '2': {'name': 'Green', 'qty': '1', 'sub': []},
     '3': {'name': 'Blue', 'qty': '1', 'sub': ['sea']}}

我能够排除重复项,但我很难增加'qty'字段:

b = {}

for k,v in a.iteritems():
    if v not in b.values():
        b[k] = v

P.S。:我之前发布过这个问题,但忘了添加字典可以有'sub'字段,这是一个列表。另外,不要介意奇怪的字符串索引。

2 个答案:

答案 0 :(得分:1)

首先,将原始字典'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))}

答案 1 :(得分:0)

也许您可以尝试使用这样的计数器:

b = {}
count = 1
for v in a.values():
    if v not in b.values():
        b[str(count)] = v
        count += 1

print b