Как получить значения из словаря в порядке сортировки ключей?

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
    Там нет методов класса там.
Показать ещё 2 комментария
Теги:
sorting
dictionary

2 ответа

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  
1

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

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 (key), потому что ключ является int.
  4. Добавлено число тестов
  5. изменен s на ->
  6. Упрощенный цикл for.
  • 0
    sorted () не работает, так как дочерний атрибут является словарем и возвращает ошибку. «Объект dict не имеет атрибута отсортированный»
  • 0
    Не знаю, о чем вы говорите, приведенный выше код работает. Я исправил несколько ошибок, которые у вас были.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню