简体   繁体   English

Python3,构建嵌套字典

[英]Python3, building nested dictionary

I'm new with Python, coming from Perl where I've used something like this very often:我是 Python 的新手,来自 Perl,我经常使用这样的东西:

#!/usr/bin/env perl
  
my %d;
my $a = 12; $b = 14; $c = 16;

$d{$a}{$b}{$c} = 42;

print($d{$a}{$b}{$c});  # 42

How can fill a dictionary in python eg in a loop如何在 python 例如循环中填充字典

If I try this with Python, I've got a KeyError如果我用 Python 试试这个,我有一个 KeyError

a = 12
b = 14
c = 16

my_dict[a][b][c] = 42  # KeyError

Is this the only way?这是唯一的方法吗?

if a in my_dict:
    if b in my_dict[a]:
        my_dict[a][b][c] = 42
    else:
        my_dict[a][b] = {}
        my_dict[a][b][c] = 42
else:
    my_dict[a] = {}
    my_dict[a][b] = {}
    my_dict[a][b][c] = 42

You may usedict.setdefault(key, default_value)您可以使用dict.setdefault(key, default_value)

my_dict = {}
my_dict.setdefault(a, {}).setdefault(b, {}).setdefault(c, 42)
print(my_dict)  # {12: {14: {16: 42}}}

my_dict = {a: {}}
my_dict.setdefault(a, {}).setdefault(b, {}).setdefault(c, 42)
print(my_dict)  # {12: {14: {16: 42}}}

my_dict = {a: {b: {}}}
my_dict.setdefault(a, {}).setdefault(b, {}).setdefault(c, 42)
print(my_dict)  # {12: {14: {16: 42}}}

it is actually better to use deafaultdict instead for this specific use case (it is a nested default dict inspired from this answer ):对于这个特定的用例,实际上最好使用默认字典(它是一个嵌套的默认字典,灵感来自这个答案):

from collections import defaultdict 

def nested_dict():
    return defaultdict(nested_dict)

my_dict = defaultdict(nested_dict)

a = 12
b = 14
c = 16

my_dict[a][b][c] = 42  # no KeyError
my_dict[a][b][c] 
>>> 42

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM