当前位置:  开发笔记 > 编程语言 > 正文

在Python中初始化词典的最佳方法是什么?

如何解决《在Python中初始化词典的最佳方法是什么?》经验,为你挑选了3个好方法。

在Perl很多次,我会做这样的事情:

$myhash{foo}{bar}{baz} = 1

我怎么把它翻译成Python?到目前为止,我有:

if not 'foo' in myhash:
    myhash['foo'] = {}
if not 'bar' in myhash['foo']:
    myhash['foo']['bar'] = {}
myhash['foo']['bar']['baz'] = 1

有没有更好的办法?



1> John Fouhy..:

如果您需要的嵌套量是固定的,那就collections.defaultdict太棒了.

例如筑巢两个深:

myhash = collections.defaultdict(dict)
myhash[1][2] = 3
myhash[1][3] = 13
myhash[2][4] = 9

如果你想进入另一层嵌套,你需要做类似的事情:

myhash = collections.defaultdict(lambda : collections.defaultdict(dict))
myhash[1][2][3] = 4
myhash[1][3][3] = 5
myhash[1][2]['test'] = 6

编辑:MizardX指出我们可以通过一个简单的函数获得完全的通用性:

import collections
def makehash():
    return collections.defaultdict(makehash)

现在我们可以做到:

myhash = makehash()
myhash[1][2] = 4
myhash[1][3] = 8
myhash[2][5][8] = 17
# etc


或def makehash():return collections.defaultdict(makehash); myhash = makehash()

2> nosklo..:
class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value

测试:

a = AutoVivification()

a[1][2][3] = 4
a[1][3][3] = 5
a[1][2]['test'] = 6

print a

输出:

{1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}


此功能具有副作用,即任何尝试获取不存在的密钥也会创建密钥.通常,如果您同时设置密钥或子密钥,则只需要自动创建密钥.
是否可以扩展它以支持以下行为:a [1] [2] [3] + = some_value.因此,如果密钥不存在,那么a [1] [2] [3]将使用类型的默认值(some_value)进行初始化?

3> zweiterlinde..:

是否有理由需要成为决定词?如果这个特定结构没有令人信服的理由,你可以简单地用一个元组索引dict:

mydict = {('foo', 'bar', 'baz'):1} # Initializes dict with a key/value pair
mydict[('foo', 'bar', 'baz')]      # Returns 1

mydict[('foo', 'unbar')] = 2       # Sets a value for a new key

如果使用元组键初​​始化dict,则必须使用括号,但在使用[]设置/获取值时可以省略它们:

mydict = {}                        # Initialized the dict
mydict['foo', 'bar', 'baz'] = 1    # Sets a value
mydict['foo', 'bar', 'baz']        # Returns 1

推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有