В диктовке dicts, как вы эмулируете поведение Auto-vivification Perl?
Как Google, так и онлайн-документы не дают большого понимания моего запроса, поэтому я подумал, что я попрошу сообщество здесь.
В Perl вы можете легко настроить хеш-а-хеш-а-хэш и протестировать последний ключ следующим образом:
my $hash = {};
$hash{"element1"}{"sub1"}{"subsub1"} = "value1";
if (exists($hash{"element1"}{"sub1"}{"subsub1"})) {
print "found value\n";
}
Какой эквивалент "лучшей практики" в Python?
Ответы
Ответ 1
Ближайший эквивалент, вероятно, примерно такой:
import collections
def hasher():
return collections.defaultdict(hasher)
hash = hasher()
hash['element1']['sub1']['subsub1'] = 'value1'
if 'subsub1' in hash['element1']['sub1']:
print 'found value'
Ответ 2
Относительно того, является ли это наилучшей практикой в Python, нужно обсудить:
hash = {}
hash['element1', 'sub1', 'subsub1'] = 'value'
if ('element1', 'sub1', 'subsub1') in hash:
print "found value"
Но это, безусловно, работает и очень элегантно, если оно работает для вас.
Основной недостаток заключается в том, что у вас нет промежуточного доступа. Вы не можете:
if ('element1', 'sub1') in hash:
print "found value"
Ответ 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 Автовизуализация
Ответ 4
Я не знаю, соглашу ли я, но так я обычно декларирую словари словарей:
someObj = {
'element1': {
'sub1': {
'subsub1': 'value1'
}
}
}
Что касается проверки наличия элемента, я согласен с этим подходом:
try:
someObj['element1']['sub1']['subsub1']
except KeyError:
print('no value found')
else:
print('found value')