在字典列表中查找重复值并总结其他相关值

时间:2019-07-14 21:25:47

标签: python python-3.x dictionary

我有带有产品信息的字典列表。我需要总结相同产品的价格字段,并以相同格式获得结果。

我有:

data = [
    {'title': 'Apple', 'price': '200'},
    {'title': 'Apple', 'price': '300'},
    {'title': 'Apple', 'price': '400'},
    {'title': 'Samsung', 'price': '250'},
    {'title': 'Sony', 'price': '100'}
]

我需要:

data = [
    {'title': 'Apple', 'price': '900'},
    {'title': 'Samsung', 'price': '250'},
    {'title': 'Sony', 'price': '100'}
]

2 个答案:

答案 0 :(得分:2)

itertools.groupby

[
    {'title': k, 'price': str(sum(int(i['price']) for i in g))}
    for k, g in itertools.groupby(data, key=lambda x: x['title'])
]
  • for k, g in itertools.groupby(data, key=lambda x: x['title'])遍历通过将data上的title分组而创建的密钥组
  • {'title': k, 'price': str(sum(int(i['price']) for i in g))}是对dict的理解,其中包含price的值,该值是通过对组进行迭代并sum设置price来创建的

示例:

In [472]: data = [ 
     ...:     {'title': 'Apple', 'price': '200'}, 
     ...:     {'title': 'Apple', 'price': '300'}, 
     ...:     {'title': 'Apple', 'price': '400'}, 
     ...:     {'title': 'Samsung', 'price': '250'}, 
     ...:     {'title': 'Sony', 'price': '100'} 
     ...: ]                                                                                                                                                                                                 

In [473]: [{'title': k, 'price': str(sum(int(i['price']) for i in g))} for k, g in itertools.groupby(data, key=lambda x: x['title'])]                                                                       
Out[473]: 
[{'title': 'Apple', 'price': '900'},
 {'title': 'Samsung', 'price': '250'},
 {'title': 'Sony', 'price': '100'}]

如果输入没有排序,则需要首先根据title键对其进行排序,即:

sorted(data, key=lambda x: x['title'])

答案 1 :(得分:0)

使用此:

data = [
    {'title': 'Apple', 'price': '200'},
    {'title': 'Apple', 'price': '300'},
    {'title': 'Apple', 'price': '400'},
    {'title': 'Samsung', 'price': '250'},
    {'title': 'Sony', 'price': '100'}
]

price = {}

for row in data:
    if row['title'] not in price:
        price[row['title']] = 0
    price[row['title']] += int(row['price'])

data = []

for title in price:
    data.append({'title': title, 'price': str(price[title])})

print(data);