Как получить значения из словаря в порядке сортировки ключей? - PullRequest
1 голос
/ 21 июня 2011

У меня проблема с моим классом 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   

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Обратите внимание, что словари не упорядочены, поэтому, чтобы быть уверенным, что значения будут обрабатываться в упорядоченном формате, вам необходимо сначала отсортировать их.Пожалуйста, найдите образец ниже:

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  
1 голос
/ 21 июня 2011

Вы можете использовать сортировку (что я бы посоветовал, потому что она сокращает ваш код, и еще один пример ниже), или просто вызвать сортировку по ключам.Сортировка не возвращает значение, она просто сортирует любой предоставленный список.

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 k = v
  2. Я инициализировал tree_as_string = "" Вы определили переменную класса, но никогда не использовали ее.
  3. Я добавил str (ключ), потому что ключ - это целое число.
  4. Добавлены дополнительные тестовые номера
  5. изменил s на ->
  6. Упростил цикл for.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...