![](/img/trans.png)
[英]How to iterate and append key value pairs from a dictionary within a dicionary and storing values with same key into a list python
[英]How to iterate list in dictionary, get value from key and append to list?
給定一個字典列表,其中每個字典都有一個帶有字典列表的鍵,方法如下:
data = [
{
"team": {
"name": "Arsenal",
"club": {
"name": "Arsenal",
"shortName": "Arsenal",
"abbr": "ARS",
"id": 1
},
"teamType": "FIRST",
"shortName": "Arsenal",
"id": 1
},
"players": [
{
"id": 4985
},
{
"id": 4474
}]}]
我想創建一個新的字典列表,其中 output 是玩家中每個玩家的字典列表,但是當我 append stats_temp
到info_all
時,每個團隊的所有玩家的id
值都是相同的。 我該如何解決這個問題?
現在我從info_all
info all = [{'id': 4985,
'team': 'Arsenal',
'team_id': 1,
'team_shortName': 'Arsenal'},
{'id': 4985,
'team': 'Arsenal',
'team_id': 1,
'team_shortName': 'Arsenal'}]
應該:
info all = [{'id': 4985,
'team': 'Arsenal',
'team_id': 1,
'team_shortName': 'Arsenal'},
{'id': 4474,
'team': 'Arsenal',
'team_id': 1,
'team_shortName': 'Arsenal'}]
def deep_get(dictionary, keys, default=None):
"""Get values of nested keys from dict
Args:
dictionary(dict): Dict with nested keys
keys(dict.keys()): "." separated chain of nested keys, ex "info.player.name"
"""
return reduce(lambda d, key: d.get(key, default) if isinstance(d, dict) else default, keys.split("."), dictionary)
def read_team_squads(data):
"""Read info from ...playerstats.json into flattened
list of dicts.
"""
info_all = []
for d in data:
stats_temp = {}
players = d['players']
team = d['team']
stats_temp = \
{'team' : team['name'],
'team_id' : deep_get(team, 'club.id'),
'team_shortName' : deep_get(team, 'club.shortName'),}
for player in players:
stats_temp['id'] = player['id']
info_all.append(stats_temp)
print(stats_temp)
print(info_all)
return info_all
您必須將stats_temp
移到循環中以避免參考問題。
考慮以下示例
items = []
for i in range(3):
tmpd = {'i': i}
for j in range(3):
tmpd['j'] = j
items.append(tmpd)
>>>items
[{'i': 0, 'j': 2},
{'i': 0, 'j': 2},
{'i': 0, 'j': 2},
{'i': 1, 'j': 2},
{'i': 1, 'j': 2},
{'i': 1, 'j': 2},
{'i': 2, 'j': 2},
{'i': 2, 'j': 2},
{'i': 2, 'j': 2}]
將此與
items = []
for i in range(3):
for j in range(3):
tmpd = {'i': i, 'j': j}
items.append(tmpd)
>>>items
[{'i': 0, 'j': 0},
{'i': 0, 'j': 1},
{'i': 0, 'j': 2},
{'i': 1, 'j': 0},
{'i': 1, 'j': 1},
{'i': 1, 'j': 2},
{'i': 2, 'j': 0},
{'i': 2, 'j': 1},
{'i': 2, 'j': 2}]
stats_temp
dict 引用為所有玩家共享。 如果您為一名玩家更改stats_temp['id'] =...
,則所有玩家都可以看到更改,因為它是同一個字典 object。
要解決它,請在每次循環迭代中復制 dict:
for player in players:
stats_temp = dict(stats_temp) # Insert this line.
或者,您可以像這樣復制:
import copy
...
for player in players:
stats_temp = copy.deepcopy(stats_temp)
或者,您可以在每次迭代中創建一個新的字典:
for player in players:
stats_temp = {...} # Creates a new dict.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.