【问题标题】:How to write a nested dict with lists as values for each nested dict如何编写一个嵌套字典,其中列表作为每个嵌套字典的值
【发布时间】:2021-06-13 21:58:23
【问题描述】:

我想我知道我想要什么。我的输出需要有“团队”作为字典键,每个字典键都有一个嵌套字典,在每个嵌套字典中,键将是玩家姓名,每个嵌套字典键的值将是每场比赛的目标列表.我希望能够最终找出每支球队进球最多的人。

我不知道数据框是否更适合这个?

制作嵌套字典的代码 - 我不知道该怎么做

mydict = {"team" : {"players" : "goals_each_game"}}

team = list(range(1, 7))
print("team : ", team)
players = ["gk", "lb", "dl", "dr", "rb", "rw", "rm", "lm", "lw", "ls", "rs" ]
goals_each_game = list(range(1,7))

for d in team:
    for k, v in mydict.items():
        mydict["team"] = d
        


        #mydict[v] = a nested dict of each player and their list of goals
        for p in players:

            teamlist = []

            new_dict = {}

            for k,v in new_dict.items():

                new_dict[k] = p

                new_dict[v] = goals_each_game

                teamlist.append(new_dict)


        mydict[v] = teamlist


            

for k,v in mydict.items():
    print(k,v)

预期输出

我想知道如何做到这一点,并将任何值列表放入嵌套的 dicts 中,而不是 [1, 2, 3]。

mydict = {"1": [{"gk":[1,2,3]}, {"lb":[1,2,3]}] ,"2": [{"gk":[1,2,3]}, {"lb":[1,2,3]}], "3": [{"gk":[1,2,3]}, {"lb":[1,2,3]}] ,"4": [{"gk":[1,2,3]}, {"lb":[1,2,3]}] }


for k,v in mydict.items():
    print(k,v)

team :  [1, 2, 3, 4, 5, 6]
1 [{'gk': [1, 2, 3]}, {'lb': [1, 2, 3]}]
2 [{'gk': [1, 2, 3]}, {'lb': [1, 2, 3]}]
3 [{'gk': [1, 2, 3]}, {'lb': [1, 2, 3]}]
4 [{'gk': [1, 2, 3]}, {'lb': [1, 2, 3]}]

【问题讨论】:

    标签: python list dataframe dictionary nested


    【解决方案1】:

    您最外层的字典是一个字典,其键是团队索引,其值是 列表

    如果您的目标是让每个值成为进球数的球员姓名首字母字典,您希望 teamlist 成为 {}(并且对 teamlist.append 的调用被替换为分配)。

    你可以用理解更惯用地写这个:

    goals_per_game = list(range(1, 7))
    
    mapping = {
        d: {
            p: goals_per_game
            for p in players
        }
        for d in teams
    }
    

    这里有一些注意事项。首先是所有球队共享相同的球员;您可能需要维护一个单独的字典,将球队映射到球员姓名首字母。

    第二个是——正如所写——goals_per_game 将是所有玩家的同一个对象:

    Python 中的赋值语句不会复制对象,它们会在目标和对象之间创建绑定

    (reference)

    这意味着在上述实现中为 one 玩家改变列表将改变 所有 玩家的列表。考虑:

    mapping[1]['gk'].append(100)
    
    print(mapping[2]['lb'])  # Has 100!
    

    为了解决这个问题,您可以为每个玩家构建一个新列表(即分别调用list o range使用copy为每个玩家构建一个副本。

    【讨论】:

    • 谢谢,goas_each_game 的列表因玩家而异。谢谢 crcvd。
    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2019-01-09
    • 2021-06-08
    • 1970-01-01
    • 2017-06-17
    • 2022-12-05
    • 1970-01-01
    相关资源
    最近更新 更多