Skip to main content
 首页 » 编程设计

python之填充嵌套字典

2025年05月04日11mq0036

我有一长串嵌套元组,我正在迭代并以某种方式追加,这样一个空字典:

dict = {} 

将像这样填充:

dict = {a: {b:1,5,9,2,3}, b: {c:7,4,5,6,2,4}, c: {b:3,13,2,4,2}... } 

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

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] 

我的方法的问题是迭代失败,因为字典一开始是空的,或者嵌套的父项在字典中不存在。对我来说越来越复杂了。我无法在网上找到很多关于如何处理嵌套字典的信息,所以我认为在这里提问应该没问题。

请您参考如下方法:

这是一个使用 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 

一般来说,我更改您的代码的方法是首先确保嵌套字典存在(collections.defaultdict 会为您处理),然后始终追加一次。

有点像

for value (key1, key2) in longlist: 
    if not your_dict.get(key1): 
        your_dict[key1] = {} 
    if not your_dict.get(key1).get(key2): 
        your_dict[key1][key2] = [] 
    your_dict[key1][key2].append(value) 

也不是 for line vs "for each ..."这是解包 iterable 中的项目。你也可以这样做

for value, keys in longlist: 

但由于 keys 也是一个可迭代对象,因此如果将其包装在括号中,也可以将其解包。