2008-09-19 3 views
4

Я пытаюсь сортировать dict на основе его ключа и возвращать итератор значениям из переопределенного метода iter в классе. Есть ли более эффективный и эффективный способ сделать это, чем создавать новый список, вставляя в список, когда я сортирую ключи?Сортировка dict на __iter__

ответ

8

Как о чем-то вроде этого:

def itersorted(d): 
    for key in sorted(d): 
     yield d[key] 
+0

sorted() фактически составляет промежуточный список. – 2008-09-19 14:51:24

2

К самым простым подходом, и почти наверняка самый быстрый, что-то вдоль линий:

def sorted_dict(d): 
    keys = d.keys() 
    keys.sort() 
    for key in keys: 
     yield d[key] 

Вы не можете сортировать не извлекая все ключи. Получение всех ключей в список, а затем сортировка этого списка - самый эффективный способ сделать это; сортировка списка очень быстрая, и выбор списка ключей так же быстро, как может быть. Затем вы можете либо создать новый список значений, либо дать значения, как показано в примере. Имейте в виду, что вы не можете изменить dict, если вы повторяете его (следующая итерация завершится с ошибкой), поэтому, если вы хотите изменить dict до того, как закончите с результатом sorted_dict(), верните ему список ,

-1

Предполагая, что вы хотите сделать заказ на сортировки по умолчанию, вы можете использовали отсортирован (список) или list.sort(). Если вам нужна ваша собственная логика сортировки, списки Python поддерживают возможность сортировки на основе функции, в которой вы проходите. Например, следующее будет способ сортировки чисел от наименьшего до наибольшего (поведение по умолчанию) с использованием функции.

def compareTwo(a, b): 
    if a > b: 
    return 1 
    if a == b: 
    return 0 
    if a < b: 
    return -1 

List.Sort(compareTwo) 
print a 

Этот подход концептуально немного чище, чем ручное создание нового списка и добавления новых значений и позволяет контролировать логику сортировки.

2
def sortedDict(dictobj): 
    return (value for key, value in sorted(dictobj.iteritems())) 

Это создаст единый промежуточный список, метод sorted() вернет реальный список. Но, по крайней мере, это только один.

Смежные вопросы