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






Безусловно, самый простой и почти наверняка самый быстрый подход - это что-то вроде:
def sorted_dict(d):
keys = d.keys()
keys.sort()
for key in keys:
yield d[key]
Вы не можете выполнить сортировку, не получив все ключи. Выборка всех ключей в список и последующая сортировка этого списка - наиболее эффективный способ сделать это; Сортировка списка выполняется очень быстро, а выборка такого списка ключей происходит настолько быстро, насколько это возможно. Затем вы можете либо создать новый список значений, либо получить значения, как в примере. Имейте в виду, что вы не можете изменить dict, если вы повторяете его (следующая итерация не удастся), поэтому, если вы хотите изменить dict до того, как закончите с результатом sorted_dict (), заставьте его вернуть список .
Как насчет чего-то вроде этого:
def itersorted(d):
for key in sorted(d):
yield d[key]
было бы разумнее дать ключ, d [ключ]
@Moe: Я только что дал d [ключ], потому что вопрос был задан для «итератора значений»
Предполагая, что вам нужен порядок сортировки по умолчанию, вы можете использовать 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
Этот подход концептуально немного чище, чем создание нового списка вручную и добавление новых значений, и позволяет управлять логикой сортировки.
def sortedDict(dictobj):
return (value for key, value in sorted(dictobj.iteritems()))
Это создаст единый промежуточный список, метод sorted () вернет реальный список. Но по крайней мере, это только один.
sorted () фактически составляет промежуточный список.