Существует существующая функция, которая заканчивается следующим d
: словарь:
return d.iteritems()
который возвращает несортированный итератор для данного словаря. Я хотел бы вернуть итератор, который просматривает элементы, отсортированные по ключу . Как я могу это сделать?
python
sorting
dictionary
Майк
источник
источник
.items()
вместоiteritems()
: как сказал @Claudiu, iteritems не работает для Python 3.x, ноitems()
доступен из Python 2.6.items()
создает список и, следовательно, использует память, тогда как поiteritems()
существу не использует память. Что использовать в основном зависит от размера словаря. Кроме того, автоматический инструмент преобразования Python 2 в Python 3 (2to3
) автоматически выполняет преобразование изiteritems()
вitems()
, поэтому об этом не нужно беспокоиться.collections.OrderedDict
тогда, вы сортируете один раз и получаете элементы в отсортированном порядке всегда.iteritems()
не использует память, все должно быть сохранено в памятиsorted()
, так что нет никакой разницы между использованиемitems()
иiteritems()
здесь в отношении памяти.items()
(в списке, возвращенномitems()
и в отсортированном списке) и только один раз сiteritems()
(только в отсортированном списке).Используйте
sorted()
функцию:Если вам нужен реальный итератор для отсортированных результатов, поскольку он
sorted()
возвращает список, используйте:источник
Ключи диктовки хранятся в хеш-таблице, так что это их «естественный порядок», то есть псевдослучайный. Любой другой заказ - это концепция потребителя диктата.
sorted () всегда возвращает список, а не диктат. Если вы передадите ему dict.items () (который создает список кортежей), он вернет список кортежей [(k1, v1), (k2, v2), ...], которые можно использовать в цикле в некотором смысле очень похоже на диктовку, но в любом случае это не диктат !
Следующее выглядит как диктовка в цикле, но это не так, это список кортежей, распаковываемых в k, v:
Примерно эквивалентно:
источник
sorted(foo.keys())
лучше в качестве эквивалентаsorted(foo)
, так как словари возвращают свои ключи при повторной итерации (с преимуществом не необходимости создаватьfoo.keys()
промежуточный список, может быть - в зависимости от того, какsorted()
реализовано для итерируемых элементов).k in sorted(foo.keys()):
которая тянет клавиши илиfor k,v in sorted(foo.items()):
возвращает копию пар списка словаря, я бы предположилsorted(foo.keys())
Грег ответил правильно. Обратите внимание, что в Python 3.0 вам придется делать
как
iteritems
уйдет.источник
Теперь вы можете использовать и
OrderedDict
в Python 2.7:Здесь у вас есть новая страница версии 2.7 и API OrderedDict .
источник
В общем, сортировку можно отсортировать так:
Для конкретного случая в вопросе, имеющего «замену» для d.iteritems (), добавьте такую функцию:
и поэтому конечная строка меняется от
в
или
источник
Этот метод все еще имеет сортировку O (N log N), однако после короткого линейного heapify он возвращает элементы в отсортированном порядке, что делает его теоретически более эффективным, когда вам не всегда нужен весь список.
источник
Если вы хотите отсортировать по порядку, в который элементы были вставлены, а не по порядку ключей, вам следует взглянуть на коллекции Python.OrderedDict . (Только Python 3)
источник
sorted возвращает список, отсюда ваша ошибка, когда вы пытаетесь перебрать его, но поскольку вы не можете заказать dict, вам придется иметь дело со списком.
Я понятия не имею, каков более широкий контекст вашего кода, но вы можете попробовать добавить итератор в итоговый список. как это может быть?
конечно, теперь вы будете возвращать кортежи, потому что сортировка превратила ваш диктат в список кортежей
ex: скажем, ваш dict был:
{'a':1,'c':3,'b':2}
sorted превращает его в список:поэтому, когда вы на самом деле перебираете список, вы получаете (в этом примере) кортеж, состоящий из строки и целого числа, но, по крайней мере, вы сможете перебирать его.
источник
Предполагая, что вы используете CPython 2.x и имеете большой словарь mydict, использование sorted (mydict) будет медленным, потому что sorted создает отсортированный список ключей mydict.
В этом случае вы, возможно, захотите взглянуть на мой пакет orderdict, который включает реализацию C
sorteddict
на языке C. Особенно, если вам приходится просматривать отсортированный список ключей несколько раз на разных этапах (т. Е. Количество элементов) времени жизни словарей.http://anthon.home.xs4all.nl/Python/ordereddict/
источник