Как упростить мой код с помощью python

#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. Я сомневаюсь, что это то, что он имел в виду.