从字典中排除重复值并相应地增加 'qty' 字段

Exclude repeated values from a dictionary and increment the 'qty' field accordingly

考虑到“1”、“2”、“3”、“4”是索引,而其他所有内容都是 Python 中字典的值,我试图排除重复值和发现重复项时增加数量字段。例如:

转这个:

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' 字段,它是一个列表。另外,不要介意奇怪的字符串索引。

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

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

print b

首先,将原始字典'name''sub'键转换为逗号分隔的字符串,这样我们就可以使用set():

data = [','.join([v['name']]+v['sub']) for v in a.values()]

这个returns

['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))}