我正在努力创建一个包含以下数据的嵌套字典:

Team,       Group,  ID,  Score,  Difficulty
OneTeam,    A,      0,   0.25,   4
TwoTeam,    A,      1,   1,      10
ThreeTeam,  A,      2,   0.64,   5
FourTeam,   A,      3,   0.93,   6
FiveTeam,   B,      4,   0.5,    7
SixTeam,    B,      5,   0.3,    8
SevenTeam,  B,      6,   0.23,   9
EightTeam,  B,      7,   1.2,    4

一旦导入为Pandas数据框,我会将每个功能都转换为以下列表:
teams, group, id, score, diff
使用这个堆栈溢出答案Create a complex dictionary using multiple lists我可以创建以下字典:
{'EightTeam': {'diff': 4, 'id': 7, 'score': 1.2},
 'FiveTeam': {'diff': 7, 'id': 4, 'score': 0.5},
 'FourTeam': {'diff': 6, 'id': 3, 'score': 0.93},
 'OneTeam': {'diff': 4, 'id': 0, 'score': 0.25},
 'SevenTeam': {'diff': 9, 'id': 6, 'score': 0.23},
 'SixTeam': {'diff': 8, 'id': 5, 'score': 0.3},
 'ThreeTeam': {'diff': 5, 'id': 2, 'score': 0.64},
 'TwoTeam': {'diff': 10, 'id': 1, 'score': 1.0}}

使用代码:
{team: {'id': i, 'score': s, 'diff': d} for team, i, s, d in zip(teams, id, score, diff)}
但我所追求的是以“组”为主要关键,然后是团队,然后是团队内部的id、得分和难度(如上所述)。
我试过:
{g: {team: {'id': i, 'score': s, 'diff': d}} for g, team, i, s, d in zip(group, teams, id, score, diff)}
但这不起作用,导致字典中每个组只有一个团队:
{'A': {'FourTeam': {'diff': 6, 'id': 3, 'score': 0.93}},
 'B': {'EightTeam': {'diff': 4, 'id': 7, 'score': 1.2}}}

下面是字典应该怎么看,但我不知道如何去那里-任何帮助将非常感谢!
{'A:': {'EightTeam': {'diff': 4, 'id': 7, 'score': 1.2},
  'FiveTeam': {'diff': 7, 'id': 4, 'score': 0.5},
  'FourTeam': {'diff': 6, 'id': 3, 'score': 0.93},
  'OneTeam': {'diff': 4, 'id': 0, 'score': 0.25}},
 'B': {'SevenTeam': {'diff': 9, 'id': 6, 'score': 0.23},
  'SixTeam': {'diff': 8, 'id': 5, 'score': 0.3},
  'ThreeTeam': {'diff': 5, 'id': 2, 'score': 0.64},
  'TwoTeam': {'diff': 10, 'id': 1, 'score': 1.0}}}

最佳答案

如果你绝对想运用理解力,那么这应该是可行的:

z = zip(teams, group, id, score, diff)
s = set(group)
d = { #outer dict, one entry for each different group
    group: ({ #inner dict, one entry for team, filtered for group
        team: {'id': i, 'score': s, 'diff': d}
        for team, g, i, s, d in z
        if g == group
        })
    for group in s
    }


为了清晰起见,我添加了换行符
编辑:
在评论之后,为了更好地阐明我的意图,出于好奇,我做了一个比较:
# your code goes here

from collections import defaultdict
import timeit

teams = ['OneTeam', 'TwoTeam', 'ThreeTeam', 'FourTeam', 'FiveTeam', 'SixTeam', 'SevenTeam', 'EightTeam']
group = ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B']
id = [0, 1, 2, 3, 4, 5, 6, 7]
score = [0.25, 1, 0.64, 0.93, 0.5, 0.3, 0.23, 1.2]
diff = [4, 10, 5, 6, 7, 8, 9, 4]

def no_comprehension():
    global group, teams, id, score, diff
    groups = defaultdict(dict)
    for g, team, i, s, d in zip(group, teams, id, score, diff):
        groups[g][team] = {'id': i, 'score': s, 'diff': d }

def comprehension():
    global group, teams, id, score, diff
    z = zip(teams, group, id, score, diff)
    s = set(group)
    d = {group: ({team: {'id': i, 'score': s, 'diff': d} for team, g, i, s, d in z if g == group}) for group in s}

print("no comprehension:")
print(timeit.timeit(lambda : no_comprehension(), number=10000))
print("comprehension:")
print(timeit.timeit(lambda : comprehension(), number=10000))

executable version
输出:
no comprehension:
0.027287796139717102
comprehension:
0.028979241847991943

从性能上看,它们确实是一样的。在我上面的句子中,我只是强调这是@JohnO已经发布的另一个解决方案。

关于python - 从Python中的多个列表创建复杂的嵌套字典,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56294486/

10-08 22:10
查看更多