gpt4 book ai didi

Python。列表到嵌套字典 : strange behaviour

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:02 25 4
gpt4 key购买 nike

我是 Python 3.6 用户。我面临着一个看似简单的任务:将 list 转换为 dict。我看到这个helpful question获取灵感。

让我解释一下我的目标:从这样的对象列表开始:

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}})

我的问题:

  • 我认为当我使用 dict comprehension 只为每个 superset 保留一个元素时,我认为以同样的方式更新字典,如 here 所解释的那样.我说得对吗?

  • 如何以 Python 方式构建我的嵌套字典?

最佳答案

你遇到的问题是:

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

尽善尽美。


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}}

关于Python。列表到嵌套字典 : strange behaviour,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53123158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com