1 回答
TA贡献1891条经验 获得超3个赞
您遇到的问题在这里:
d = {x.superset: {x.subset : x.number} for x in o}
任何时候你得到一个新x.superset的已经在要构建的字典中,它会覆盖前一个 - 它类似于
d2 = { k:v for k,v in [ (1,4),(1,7),(1,9)]} # d2 == {1:9,} - last value to key 1 survives
你多装一层的事实并不重要 - 如果你在 dict-comp 中提供多个相同的键,你会得到覆盖行为 - 而不是更新行为。
您的
from collections import defaultdict
d2 = defaultdict(dict)
for x in o:
d2[x.superset][x.subset] = x.number
就像它得到的那样pythonic。
defaultdict-aproach 类似于(但更有效):
d2 = {}
for x in o:
k = d2.setdefault(x.superset,{})
k[x.subset] = x.number
# {'a': {'a1': 1, 'a2': 0}, 'b': {'b1': 3, 'b2': 2}}
dict comp 方法类似于:
for x in o:
d2[x.superset] = {x.subset:x.number}
# {'a': {'a1': 1}, 'b': {'b1': 3}}
添加回答
举报