Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

Безусловно, самый простой подход и почти наверняка самый быстрый — это что-то вроде:

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top