Python 如何按键的排序顺序从字典中获取值?

Python 如何按键的排序顺序从字典中获取值?,python,sorting,dictionary,Python,Sorting,Dictionary,我的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

我的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   
您可以使用sorted(我建议使用sorted,因为它会减少您的代码,下面还有更详细的示例),或者只调用键上的sort。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()

旁注:我把你的代码改了一点

  • 我修正了你的dict语法:k:v verus k=v
  • 我将tree_初始化为_string=”“您定义了一个类变量,但从未使用过它
  • 我添加了str(key),因为key是int
  • 增加了更多的测试号码
  • 将s更改为->
  • 简化了for循环
  • 您可以使用sorted(我建议使用sorted,因为它会减少您的代码,下面还有更详细的示例),或者只调用键上的sort。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()
    

    旁注:我把你的代码改了一点

  • 我修正了你的dict语法:k:v verus k=v
  • 我将tree_初始化为_string=”“您定义了一个类变量,但从未使用过它
  • 我添加了str(key),因为key是int
  • 增加了更多的测试号码
  • 将s更改为->
  • 简化了for循环

  • 请注意,字典是无序的,因此为了确保以有序格式处理值,您需要首先对它们进行排序。请参阅以下样本:

    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  
    

    请注意,字典是无序的,因此为了确保以有序格式处理值,您需要首先对它们进行排序。请参阅以下样本:

    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  
    

    跟我重复一遍:字典是无序的。那里没有类方法。字典是无序的(@Daniel Roseman);)如果你不改变任何东西,你应该得到同样的钥匙顺序。这并不完全是“无序的”,尽管在实践中有这样的说法:字典是无序的。那里没有类方法。字典是无序的(@Daniel Roseman);)如果你不改变任何东西,你应该得到同样的钥匙顺序。这并不完全是“无序”的,尽管在实践中,据说This waysorted()不起作用,因为子属性是字典,它返回一个错误。“'dict'对象没有'sorted'属性”不知道你在说什么,上面的代码可以工作。我修复了您的多个错误。@trey如果您必须对键进行排序,则无法对dict进行排序。sorted()不起作用,因为子属性是字典,它返回一个错误。“'dict'对象没有'sorted'属性”不知道你在说什么,上面的代码可以工作。我修复了您的多个错误。@trey您必须对键进行排序,但无法对dict进行排序。