我是一名Python 3.6用户。我面临一个明显简单的任务:将一个列表转换为字典。我看到了这个有用的问题以获取灵感。
让我解释一下我的目标:从这样的对象列表开始:
我希望有这样一种字典:
我的起点是一个简单的列表:
但是
让我解释一下我的目标:从这样的对象列表开始:
class AObject():
def __init__(self, sp, sb, n):
self.superset = sp
self.subset = sb
self.number = n
我希望有这样一种字典:
d[superset][subset] = number
。我的起点是一个简单的列表:
s = set((('a','a1'),('a','a2'),('b','b1'),('b','b2'))) #set of tuples
o = [AObject(t[0], t[1], n) for t, n in zip(s, range(0,4))]
长度为4。
现在我以这种方式创建字典:
d = {x.superset: {x.subset : x.number} for x in o}
但是
d
Out[5]: {'a': {'a1': 1}, 'b': {'b1': 3}}
其他两个字典项去哪了?
使用相同的结果:
d1 = dict(map(lambda x: (x.superset, {x.subset : x.number}), o))
同时,使用for循环:
from collections import defaultdict
d2 = defaultdict(dict)
for x in o:
d2[x.superset][x.subset] = x.number
d2
defaultdict(dict, {'a': {'a1': 1, 'a2': 0}, 'b': {'b1': 3, 'b2': 2}})
我的问题:
我认为当我使用字典推导式仅保留每个
superset
的一个元素时,字典也会更新,就像这里所解释的一样。我是正确的吗?如何以Pythonic的方式构建我的嵌套字典?
for x in o: ...
是 Pythonic 的写法。 - Patrick Artnerfor
循环是有效的。但是有没有更紧凑的方法来创建嵌套字典呢? - Marco