2011-06-21 175 views
1

我有一個問題,我的Python類。它包含一個遍歷多維字典的所有關鍵字的方法。字典鍵可以按照以下順序(1→2,3),2→(5,6))。問題是當方法嘗試獲取密鑰時,有時它會以正確的順序(1,2)獲取它們,有時它會以錯誤的順序(2,1)獲取它們。任何幫助將不勝感激。下面是一個什麼樣的代碼可能看起來像如何從按字典排序的字典中獲取值?

class tree: 
    tree_as_string = "" 
    def __init__(self): 
     self.id = "" 
     self.daughters = {1 = 'node0', 2 = 'node1'} 
    def get_as_string(self): 
     s = '' 
     for key in self.daughters: 
     tree_as_string = s.join([tree_as_string, key]) 
     return tree_as_string 
+7

重複:字典是無序的。 –

+1

那裏沒有類方法。 –

+0

字典無序(@Daniel Roseman);) – Nix

回答

1

您可以使用排序(這我會建議,因爲它降低了代碼更進一步的例子如下),或者只是調用排序上的按鍵非常簡單的例子。 Sort不返回值,它只是對提供的任何列表進行排序。

class tree: 
    def __init__(self): 
    self.id = "" 
    self.daughters = {10: "test10", 2 : 'node2', 1 :'node1', 0 : 'node0'} 

    def get_as_string_using_sorted(self): 
    ''' Makes me happy''' 
    return '->'.join(str(k) for k in sorted(self.daughters)) 

    def get_as_string(self): 
    s = '->' 
    keys = self.daughters.keys() 
    keys.sort() 
    return s.join(str(k) for k in keys) 


t = tree() 
print t.get_as_string() 
print t.get_as_string_using_sorted() 

附註我改變你的代碼位。

  1. 我定你的字典語法其K:v VERUSķ= V
  2. 我初始化tree_as_string = 「」 你定義的類變量,但從未使用過它。
  3. 我添加了str(key),因爲key是一個int。
  4. 增加了更多的測試號
  5. 改變s到 - >
  6. 簡化您的for循環。
+0

排序()不起作用,因爲女兒屬性是一個字典n它返回一個錯誤。 「'dict'對象沒有屬性'排序'」 – trey

+0

不知道你在說什麼,上面的代碼工作。我修復了你的多個錯誤。 – Nix

+0

@trey你必須排序鍵,你不能排序字典。 – juanchopanza

3

請注意,字典是無序的,所以爲了確保值將按照有序格式進行處理,您需要先排序它們。請看以下例子:

d={1:{2:'tst', 3:'tst2'}, 4:{...} } 

for key in sorted(d): 
    for skey in sorted(d[key]): 
     #do something 

或者是這樣的:

from operator import itemgetter 

d={1:{2:'tst', 3:'tst2'}, 4:{6:'tst7', 7:'tst12'} } 

for key, val in sorted(d.items(), key=itemgetter(0)): 
    for skey, sval in sorted(val.items(), key=itemgetter(0)): 
     print key, skey, sval 

這意味着,在您的情況:在我之後

class tree(object): 

    tree_as_string = "" 

    def __init__(self): 
     self.id = "" 
     self.daughters = {1 = 'node0', 2 = 'node1'} 

    def get_as_string(self): 
     s = '' 
     for key in sorted(self.daughters): 
     tree_as_string = s.join([tree_as_string, key]) 
     return tree_as_string