簡體   English   中英

如何迭代字典中的列表,從鍵和 append 中獲取值以列出?

[英]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_tempinfo_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.

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