填充嵌套字典

2024-07-05 15:49:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很长的嵌套元组列表,我正在迭代这些元组,并以某种方式附加到一个空字典中:

dict = {}

会像这样填充:

^{pr2}$

迭代将检查是否存在嵌套字典,如果存在,则将追加该值,否则,创建一个嵌套字典。我糟糕的尝试看起来像这样:

longlist = [(1,(a,b)),(2,(b,c)), (3,(c,b)) ... ]
dict = {}
    for each in longlist:
        if dict[each[1][0]][each[1][1]]:
            dict[each[1][0]][each[1][1]].append(each[0])
        else:
            dict[each[1][0]] = {}
            dict[each[1][0]][each[1][1]] = each[0]

我的方法的问题是迭代失败,因为字典开头是空的,或者dict中不存在嵌套的父元素,这对我来说变得越来越复杂。我在网上找不到很多关于如何处理嵌套词典的信息,所以我想可以在这里问一下。在


Tags: 方法in元素列表forif字典方式
2条回答

无需深入研究您要做的事情,您可以将if语句重写为not如果键不存在,则抛出一个错误:

if dict_.get(each[1][0], {}).get(each[1][1], None):
    dict_[each[1][0]][each[1][1]].append(each[0])

dict.get是一个非常有用的函数,因为如果给定的键不存在,它将返回一个特定的默认值。在

而且,似乎你希望有一个列表存在。在else块中,您是有意这样做的吗?在

^{pr2}$

这将创建一个包含单个元素的列表,因此现在dict[...][...].append(...)就可以工作了。在

我还建议不要使用dict来命名变量。它隐藏了内置类。在

进一步的改进可能包括在for循环的头中解包项,因此您不必执行each[0]each[1]等操作。您可以使用类似于:

for idx, pair in longlist:
    x, y = pair # unpack each pair now
    ...

完整列表:

dict_ = {}
for idx, pair in longlist:
    x, y = pair
    if dict_.get(x, {}).get(y, None):
        dict_[x][y].append(idx)

    else:
        dict_[x] = {y : [idx] }

这比以前更易读。在

下面是一个使用collections.defaultdict的解决方案

import random
import collections
choices = ['a', 'b', 'c', 'd', 'e', 'f']

longlist = []
for i in range(1, 101):
    longlist.append((i, tuple(random.sample(choices, 2))))

print longlist

final = collections.defaultdict(lambda: collections.defaultdict(list))

for value, (key1, key2) in longlist:
    final[key1][key2].append(value)


print final

一般来说,更改代码的方法是首先确保嵌套字典的存在(集合.defaultdict为您处理这个)然后总是附加一次。在

有点像

^{pr2}$

也不是for行vs“for each…”这是将iterable中的项解包。你也可以这么做

for value, keys in longlist:

但是,由于keys也是iterable,所以如果用parens包装它,也可以将其解包。在

相关问题 更多 >