簡體   English   中英

字典為相同的鍵添加值

[英]dictionary add values for the same keys

我有一個字典列表:

[{'name':'Jay', 'value':'1'},{'name':'roc', 'value':'9'},{'name':'Jay', 'value':'7'},{'name':'roc', 'value':'2'}]

我希望它是:

[{'name':'Jay', 'value':'8'},{'name':'roc', 'value':'11'}]

我試過循環,但我無法找到一個可以做到這一點的例子。 任何提示或想法將不勝感激。

您可以使用defaultdict

lst = [{'name':'Jay', 'value':'1'},{'name':'roc', 'value':'9'},{'name':'Jay', 'value':'7'},{'name':'roc', 'value':'2'}]

1)每個名稱的總和值:

from collections import defaultdict    
result = defaultdict(int)

for d in lst:
    result[d['name']] += int(d['value'])

2)將名稱 - 值對轉換為列表中的字典:

[{'name': name, 'value': value} for name, value in result.items()]
# [{'name': 'roc', 'value': 11}, {'name': 'Jay', 'value': 8}]

或者,如果您希望值為str類型,請注意@Kevin:

[{'name': name, 'value': str(value)} for name, value in result.items()]
​# [{'name': 'roc', 'value': '11'}, {'name': 'Jay', 'value': '8'}]

這是itertools.groupby一個很好的用例。

from itertools import groupby
from operator import itemgetter

orig = [{'name':'Jay', 'value':'1'},
        {'name':'roc', 'value':'9'},
        {'name':'Jay', 'value':'7'},
        {'name':'roc', 'value':'2'}]

get_name = itemgetter('name')
result = [{'name': name, 'value': str(sum(int(d['value']) for d in dicts))}
           for name, dicts in groupby(sorted(orig, key=get_name), key=get_name)]

打破它:

  1. get_name是一個給定字典的函數,返回其“name”鍵的值。 即, get_name = lambda x: x['name']

  2. sorted返回按"name"鍵的值排序的字典列表。

  3. groupby返回一個迭代器(name, dicts) ,其中dicts是一個列表(ok,generator),它們共享name作為"name"鍵的值。 (僅對具有相同鍵值的連續項進行分組,因此需要在上一步中對列表進行排序。)

  4. 結果是使用給定名稱的新詞典列表以及所有相關"value"元素的總和

與Psidom的答案類似,但使用collections.Counter ,它是累積整數值的理想選擇。

import collections

d =[{'name':'Jay', 'value':'1'},{'name':'roc', 'value':'9'},{'name':'Jay', 'value':'7'},{'name':'roc', 'value':'2'}]

c = collections.Counter()
for sd in d:
    c[sd["name"]] += int(sd["value"])

然后,如果需要,您需要通過轉換回字符串來重建dicts。

print([{"name":n,"value":str(v)} for n,v in c.items()])

結果:

[{'name': 'Jay', 'value': '8'}, {'name': 'roc', 'value': '11'}]

為了完整起見,沒有collections.defaultdict

data = [{'name': 'Jay', 'value': '1'}, {'name': 'roc', 'value': '9'},
        {'name': 'Jay', 'value': '7'}, {'name': 'roc', 'value': '2'}]

result = {}
# concetrate
for element in data:
    result[element["name"]] = result.get(element["name"], 0) + int(element["value"])
# unpack
result = [{"name": element, "value": result[element]} for element in result]
# optionally, you can loop through result.items()
# you can, also, turn back result[elements] to str if needed

print(result)
# prints: [{'name': 'Jay', 'value': 8}, {'name': 'roc', 'value': 11}]

itertools模塊使用groupby解決問題的另一種方法:

from itertools import groupby

a = [{'name':'Jay', 'value':'1'},{'name':'roc', 'value':'9'},{'name':'Jay', 'value':'7'},{'name':'roc', 'value':'2'}]
final = []
for k,v in groupby(sorted(a, key= lambda x: x["name"]), lambda x: x["name"]):
    final.append({"name": k, "value": str(sum(int(j["value"]) for j in list(v)))})

print(final)

輸出:

[{'name': 'Jay', 'value': '8'}, {'name': 'roc', 'value': '11'}]

這是使用熊貓的另一種方式

names = [{'name':'Jay', 'value':'1'},{'name':'roc', 'value':'9'},{'name':'Jay', 'value':'7'},
         {'name':'roc', 'value':'2'}]

df = pd.DataFrame(names)
df['value'] = df['value'].astype(int)
group = df.groupby('name')['value'].sum().to_dict()
result = [{'name': name, 'value': value} for name, value in group.items()]

哪個輸出:

[{'value': 8, 'name': 'Jay'}, {'value': 11, 'name': 'roc'}]
ld = [{'name':'Jay', 'value':'1'},{'name':'roc', 'value':'9'},{'name':'Jay', 'value':'7'},{'name':'roc', 'value':'2'}]

tempDict = {}
finalList = []


for d in ld:
  name = d['name']
  value = d['value']
  if name not in tempDict:
    tempDict[name] = 0
  tempDict[name] += int(value)

#tempDict => {'Jay': 8, 'roc': 11}

for name,value in tempDict.items():
  finalList.append({'name':name,'value':value})
print(finalList)  

# [{'name': 'Jay', 'value': 8}, {'name': 'roc', 'value': 11}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM