在dicts的词典中,你如何模仿Perl的自动生存行为?

时间:2010-06-26 03:07:24

标签: python dictionary autovivification

Google和在线文档都无法提供有关我查询的更多信息,因此我想我会在这里询问社区。

在Perl中,您可以轻松设置哈希哈希哈希值并测试最终密钥,如下所示:

my $hash = {};
$hash{"element1"}{"sub1"}{"subsub1"} = "value1";
if (exists($hash{"element1"}{"sub1"}{"subsub1"})) {
   print "found value\n";
}

Python中“最佳实践”的等价物是什么?

4 个答案:

答案 0 :(得分:16)

最接近的等价物可能类似于以下内容:

import collections

def hasher():
  return collections.defaultdict(hasher)

hash = hasher()
hash['element1']['sub1']['subsub1'] = 'value1'
if 'subsub1' in hash['element1']['sub1']:
  print 'found value'

答案 1 :(得分:5)

至于这是否是Python中的最佳实践还有争议:

hash = {}
hash['element1', 'sub1', 'subsub1'] = 'value'
if ('element1', 'sub1', 'subsub1') in hash:
    print "found value"

但是,如果适合你的话,它确实有效且非常优雅。

主要缺点是您没有中间访问权限。你不能做:

if ('element1', 'sub1') in hash:
   print "found value"

答案 2 :(得分:3)

from collections import defaultdict

tree = lambda: defaultdict(tree)

t = tree()

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

来自wikipedia Autovivification

答案 3 :(得分:0)

我不知道我是否会得到任何协议,但这就是我通常宣布词典的词典:

someObj = {
  'element1': {
    'sub1': {
      'subsub1': 'value1'
    }
  }
}

至于检查是否存在元素,我同意这种方法:

try:
  someObj['element1']['sub1']['subsub1']
except KeyError:
  print('no value found')
else:
  print('found value')