2011-04-02 94 views
0

更加简单,这是我的代码:如何使我的代码使用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 

和字典我创建的时候第一次是这样的:

stage = 
{ 
    0:{ 
     'floor':{ 
      0:{ 
       'floor_point':0, 
       'gift':{} 
      } 
     } 
    } 
} 

,但我认为我的代码是不是非常好,它是太麻烦了,

等都是有人知道更简单的方法,

感谢

+0

默认情况下,当键不存在时,'dict'' get()'方法返回'None',所以也许你的意思是'如果不是some_dict.get():'。即使这可以被关键的*值*愚弄,它们在逻辑上是'False',比如'0',''''和'[]'。如果不是some_dict.has_key()或者如果key不在some_dict中,可能会更好。 – martineau 2011-04-02 11:39:50

回答

2
data = collections.defaultdict(lambda: collections.defaultdict(
    lambda: collections.defaultdict(dict))) 
data['stage'][3]['floor_point'][2] = 5 
print data 
1

我不知道你想达到什么。在代码中反复出现的主题是:

if some_dict.get(key): 
    some_dict[key] = {} 

这意味着:如果some_dict有一个键keysome_dict[key]是truthy值,然后通过{}更换some_dict[key]。如果some_dict没有密钥keysome_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()'来测试字典键的存在是一种不好的做法 - 无论它是否包含在函数中。 – martineau 2011-04-02 11:55:51

+0

@martineau:你说得对,我们有'some_dict'键来测试密钥的存在。我旨在澄清zjm1126的代码实际上做了什么。我怀疑这是他的意图。 – jammon 2011-04-03 06:40:48