2011-04-02 90 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