#python #dictionary
#python #словарь
Вопрос:
это мой код:
def set_floor_point(self,floor_point=None):
if self.data.get('stage'):
self.data['stage'] = {}
stage_number = self.get_stage_number()
floor_number = self.get_floor_number()
if self.data['stage'].get(stage_number):
self.data['stage'][stage_number] = {}
if self.data['stage'][stage_number].get('floor_point'):
self.data['stage'][stage_number]['floor_point'] = {}
if self.data['stage'][stage_number]['floor_point'].get(floor_number):
self.data['stage'][stage_number]['floor_point'][floor_number] = {}
self.data['stage'][stage_number]['floor_point'][floor_number] = floor_point
и dict, который я создаю при первом запуске, выглядит следующим образом :
stage =
{
0:{
'floor':{
0:{
'floor_point':0,
'gift':{}
}
}
}
}
но я думаю, что мой код не очень хорош, он слишком громоздкий,
итак, кто-нибудь знает более простой способ ,
Спасибо
Комментарии:
1.По умолчанию
dict
get()
метод возвращаетNone
, когда ключ отсутствует, так что, возможно, вы имели в видуif not some_dict.get():
. Даже это может быть обмануто значениями ключей, которые логически являютсяFalse
, такими0
как''
,[]
,и,,. Вероятно, лучше использоватьif not some_dict.has_key()
илиif key not in some_dict
.
Ответ №1:
data = collections.defaultdict(lambda: collections.defaultdict(
lambda: collections.defaultdict(dict)))
data['stage'][3]['floor_point'][2] = 5
print data
Ответ №2:
Я не уверен, чего вы хотите достичь. Повторяющаяся тема в вашем коде — это:
if some_dict.get(key):
some_dict[key] = {}
Это означает: если some_dict
имеет ключ key
и some_dict[key]
является истинным значением, то замените some_dict[key]
на {}
. Если some_dict
в нем нет ключа key
или some_dict[key]
указано ложное значение ( None
, 0
, False
, []
и т.д.), то ничего не делайте.
Если это то, что вы хотели, вы могли бы уточнить свой следующим образом:
def replace_value_by_empty_dict(d, key):
if d.get(key):
d[key] = {}
...
replace_value_by_empty_dict(self.data, 'stage')
etc.
Но если это не то, что вы предполагали (код сломается, если одно из if
s будет истинным), вы можете сформулировать проблему английскими словами или псевдокодом, чтобы прояснить структуру проблемы.
И взгляните на collections.defaultdict.
Комментарии:
1. ИМХО, использование
get()
для проверки наличия словарного ключа таким способом является плохой практикой — независимо от того, заключен он в функцию или нет.2. @martineau: Вы правы, у нас есть
key in some_dict
который проверяет наличие ключа. Я стремился прояснить, что на самом деле делает код zjm1126. Я сомневаюсь, что это то, что он имел в виду.