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

在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

有没有更好的办法?


慕娘9325324
浏览 643回答 3
3回答

慕桂英4014372

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] = 4a[1][3][3] = 5a[1][2]['test'] = 6print a输出:{1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}

三国纷争

如果您需要的嵌套量是固定的,那就collections.defaultdict太棒了。例如筑巢两个深:myhash = collections.defaultdict(dict)myhash[1][2] = 3myhash[1][3] = 13myhash[2][4] = 9如果你想进入另一层嵌套,你需要做类似的事情:myhash = collections.defaultdict(lambda : collections.defaultdict(dict))myhash[1][2][3] = 4myhash[1][3][3] = 5myhash[1][2]['test'] = 6编辑:MizardX指出我们可以通过一个简单的函数获得完全的通用性:import collectionsdef makehash():    return collections.defaultdict(makehash)现在我们可以做到:myhash = makehash()myhash[1][2] = 4myhash[1][3] = 8myhash[2][5][8] = 17# etc

守着一只汪

是否有理由需要成为决定词?如果这个特定结构没有令人信服的理由,你可以简单地用一个元组索引dict:mydict = {('foo', 'bar', 'baz'):1} # Initializes dict with a key/value pairmydict[('foo', 'bar', 'baz')]      # Returns 1mydict[('foo', 'unbar')] = 2       # Sets a value for a new key如果使用元组键初始化dict,则必须使用括号,但在使用[]设置/获取值时可以省略它们:mydict = {}                        # Initialized the dictmydict['foo', 'bar', 'baz'] = 1    # Sets a valuemydict['foo', 'bar', 'baz']        # Returns 1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python