2011-06-21 133 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