Сортировка диктанта по __iter__ - PullRequest
       21

Сортировка диктанта по __iter__

5 голосов
/ 19 сентября 2008

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

Ответы [ 4 ]

8 голосов
/ 19 сентября 2008

Как насчет этого:

def itersorted(d):
    for key in sorted(d):
        yield d[key]
2 голосов
/ 19 сентября 2008
def sortedDict(dictobj):
    return (value for key, value in sorted(dictobj.iteritems()))

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

2 голосов
/ 19 сентября 2008

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

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

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

0 голосов
/ 19 сентября 2008

Предполагая, что вы хотите порядок сортировки по умолчанию, вы можете использовать sorted (list) или 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...