簡體   English   中英

更新詞典列表中的值

[英]Updating values in list of dictionaries

我有一個類似這樣的詞典列表:

users=[{"name": "David", "team": "reds", "score1": 100, "score2": 20,},
       {"name": "David", "team": "reds", "score1": 20, "score2": 60,},
       {"name": "David", "team": "blues", "score1": 10, "score2": 70,}]

並且真的想得到一個新的處理的字典列表

summary=[{"team": "reds", "total1": 120, "total2": 80,},
         {"team": "blues", "total1": 120, "total2": 80,}]

最好只循環一次原始數據。 我可以創建一個字典,為每個用戶鍵保存一個總值

summary = dict()
for user in users:
   if not user['team'] in summary:
      summary[user['team']]=float(user['score1'])
   else:
      summary[user['team']]+=float(user['score1'])

summary = {'reds': 120,'blues': 10}

但我正在努力制作字典列表,我最接近的是在團隊的第一個實例創建一個字典,然后嘗試在后續事件中附加其值...

summary = []
for user in users:
   if any(d['team'] == user['team'] for d in summary):
      # append to values in the relevant dictionary
      # ??
   else:
      # Add dictionary to list with some initial values
      d ={'team':user['team'],'total1':user['score1'],'total2':user['score2']}
      summary.append(dict(d))

......而且它變得凌亂......我是以完全錯誤的方式來做這件事的嗎? 你能改變列表中字典中的值嗎?

謝謝

我認為這是使用pandas庫進行python的好例子:

>>> import pandas as pd
>>> dfUsers = pd.DataFrame(users)
>>> dfUsers

    name  score1  score2   team
0  David     100      20   reds
1  David      20      60   reds
2  David      10      70  blues

>>> dfUsers.groupby('team').sum()

       score1  score2
team                 
blues      10      70
reds      120      80

如果你真的想把它寫成dict

>>> dfRes = dfUsers.groupby('team').sum()
>>> dfRes.columns = ['total1', 'total2']  # if you want to rename columns
>>> dfRes.reset_index().to_dict(orient='records')

[{'team': 'blues', 'total1': 10, 'total2': 70},
 {'team': 'reds', 'total1': 120, 'total2': 80}]

另一種方法是使用itertools.groupby

>>> from itertools import groupby
>>> from operator import itemgetter
>>> users.sort(key=itemgetter('team'))
>>>
>>> res = [{'team': t[0], 'res': list(t[1])} for t in groupby(users, key=itemgetter('team'))]
>>> res = [{'team':t[0], 'total1': sum(x['score1'] for x in t[1]), 'total2': sum(x['score2'] for x in t[1])} for t in res]
>>> res

[{'team': 'blues', 'total1': 10, 'total2': 70},
 {'team': 'reds', 'total1': 120, 'total2': 80}]

或者,如果你真的想要簡單的python:

>>> res = dict()
>>> for x in users:
       if x['team'] not in res:
           res[x['team']] = [x['score1'], x['score2']]
       else:
           res[x['team']][0] += x['score1']
           res[x['team']][1] += x['score2']
>>> res = [{'team': k, 'total1': v[0], 'total2': v[1]} for k, v in res.iteritems()}]
>>> res

[{'team': 'reds', 'total1': 120, 'total2': 80},
 {'team': 'blues', 'total1': 10, 'total2': 70}]

你真的很親密,你只需要一種方法來查找要更新的字典。 這是我能看到的最簡單的方法。

summary = dict()
for user in users:
   team = user['team']
   if team not in summary:
      summary[team] = dict(team=team,
                           score1=float(user['score1']), 
                           score2=float(user['score2']))
   else:
      summary[team]['score1'] += float(user['score1'])
      summary[team]['score2'] += float(user['score2'])

然后

>>> print summary.values()
[{'score1': 120.0, 'score2': 80.0, 'team': 'reds'},
 {'score1': 10.0, 'score2': 70.0, 'team': 'blues'}]

這里是我的解決方案,它會假設需要添加所有得分開始score

users=[{"name": "David", "team": "reds", "score1": 100, "score2": 20,},
       {"name": "David", "team": "reds", "score1": 20, "score2": 60,},
       {"name": "David", "team": "blues", "score1": 10, "score2": 70,}]

totals = {}
for item in users:
    team = item['team']
    if team not in totals:
        totals[team] = {}
    for k,v in item.items():
        if k.startswith('score'):
            if k in totals[team]:
                totals[team][k] += v
            else:
                totals[team][k] = v
print totals

輸出:

{'reds': {'score1': 120, 'score2': 80}, 'blues': {'score1': 10, 'score2': 70}}

請參閱內聯注釋以獲得解釋

import pprint

users=[{"name": "David", "team": "reds", "score1": 100, "score2": 20,},
       {"name": "David", "team": "reds", "score1": 20, "score2": 60,},
       {"name": "David", "team": "blues", "score1": 10, "score2": 70,}]

scores_by_team = dict()
for user in users:
    if user['team'] not in scores_by_team:
        # Make sure you're gonna have your scores zeroed so you can add the
        # user's scores later
        scores_by_team[user['team']] = {
            'total1': 0,
            'total2': 0
        }
    # Here the user's team exists for sure in scores_by_team
    scores_by_team[user['team']]['total1'] += user['score1']
    scores_by_team[user['team']]['total2'] += user['score2']

# So now, the scores you want have been calculated in a dictionary where the
# keys are the team names and the values are another dictionary with the scores
# that you actually wanted to calculate
print "Before making it a summary: %s" % pprint.pformat(scores_by_team)
summary = list()
for team_name, scores_by_team in scores_by_team.items():
    summary.append(
        {
            'team': team_name,
            'total1': scores_by_team['total1'],
            'total2': scores_by_team['total2'],
        }
    )

print "Summary: %s" % summary

這輸出:

Before making it a summary: {'blues': {'total1': 10, 'total2': 70}, 'reds': {'total1': 120, 'total2': 80}}
Summary: [{'total1': 120, 'total2': 80, 'team': 'reds'}, {'total1': 10, 'total2': 70, 'team': 'blues'}]

暫無
暫無

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

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