从字典中排除重复的值,并相应地增加“qty”字段

2024-04-26 11:52:46 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑到'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

注意:我之前发布了这个问题,但是忘了添加字典可以有“sub”字段,这是一个列表。另外,不要介意奇怪的字符串索引。你知道吗


Tags: nameinfor数量if字典greenblue
2条回答

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

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

print b

首先,将原始dict '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']

然后使用嵌套的dict和list理解,如下所示:

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

相关问题 更多 >