Ответы:
Я не тестировал это очень подробно, но работает в Python 2.5.2.
>>> d = {"x":2, "h":15, "a":2222}
>>> it = iter(sorted(d.iteritems()))
>>> it.next()
('a', 2222)
>>> it.next()
('h', 15)
>>> it.next()
('x', 2)
>>>
Если вы привыкли делать for key, value in d.iteritems(): ...
вместо итераторов, это все равно будет работать с решением выше
>>> d = {"x":2, "h":15, "a":2222}
>>> for key, value in sorted(d.iteritems()):
>>> print(key, value)
('a', 2222)
('h', 15)
('x', 2)
>>>
В Python 3.x используйте d.items()
вместо того, d.iteritems()
чтобы возвращать итератор.
items()
создает список и, следовательно, использует память, тогда как по iteritems()
существу не использует память. Что использовать в основном зависит от размера словаря. Кроме того, автоматический инструмент преобразования Python 2 в Python 3 ( 2to3
) автоматически выполняет преобразование из iteritems()
в items()
, поэтому об этом не нужно беспокоиться.
collections.OrderedDict
тогда, вы сортируете один раз и получаете элементы в отсортированном порядке всегда.
iteritems()
не использует память, все должно быть сохранено в памяти sorted()
, так что нет никакой разницы между использованием items()
и iteritems()
здесь в отношении памяти.
items()
(в списке, возвращенном items()
и в отсортированном списке) и только один раз с iteritems()
(только в отсортированном списке).
Используйте sorted()
функцию:
return sorted(dict.iteritems())
Если вам нужен реальный итератор для отсортированных результатов, поскольку он sorted()
возвращает список, используйте:
return iter(sorted(dict.iteritems()))
Ключи диктовки хранятся в хеш-таблице, так что это их «естественный порядок», то есть псевдослучайный. Любой другой заказ - это концепция потребителя диктата.
sorted () всегда возвращает список, а не диктат. Если вы передадите ему dict.items () (который создает список кортежей), он вернет список кортежей [(k1, v1), (k2, v2), ...], которые можно использовать в цикле в некотором смысле очень похоже на диктовку, но в любом случае это не диктат !
foo = {
'a': 1,
'b': 2,
'c': 3,
}
print foo
>>> {'a': 1, 'c': 3, 'b': 2}
print foo.items()
>>> [('a', 1), ('c', 3), ('b', 2)]
print sorted(foo.items())
>>> [('a', 1), ('b', 2), ('c', 3)]
Следующее выглядит как диктовка в цикле, но это не так, это список кортежей, распаковываемых в k, v:
for k,v in sorted(foo.items()):
print k, v
Примерно эквивалентно:
for k in sorted(foo.keys()):
print k, foo[k]
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 вам придется делать
sorted(dict.items())
как iteritems
уйдет.
Теперь вы можете использовать и OrderedDict
в Python 2.7:
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
Здесь у вас есть новая страница версии 2.7 и API OrderedDict .
В общем, сортировку можно отсортировать так:
for k in sorted(d):
print k, d[k]
Для конкретного случая в вопросе, имеющего «замену» для d.iteritems (), добавьте такую функцию:
def sortdict(d, **opts):
# **opts so any currently supported sorted() options can be passed
for k in sorted(d, **opts):
yield k, d[k]
и поэтому конечная строка меняется от
return dict.iteritems()
в
return sortdict(dict)
или
return sortdict(dict, reverse = True)
>>> import heapq
>>> d = {"c": 2, "b": 9, "a": 4, "d": 8}
>>> def iter_sorted(d):
keys = list(d)
heapq.heapify(keys) # Transforms to heap in O(N) time
while keys:
k = heapq.heappop(keys) # takes O(log n) time
yield (k, d[k])
>>> i = iter_sorted(d)
>>> for x in i:
print x
('a', 4)
('b', 9)
('c', 2)
('d', 8)
Этот метод все еще имеет сортировку O (N log N), однако после короткого линейного heapify он возвращает элементы в отсортированном порядке, что делает его теоретически более эффективным, когда вам не всегда нужен весь список.
Если вы хотите отсортировать по порядку, в который элементы были вставлены, а не по порядку ключей, вам следует взглянуть на коллекции Python.OrderedDict . (Только Python 3)
sorted возвращает список, отсюда ваша ошибка, когда вы пытаетесь перебрать его, но поскольку вы не можете заказать dict, вам придется иметь дело со списком.
Я понятия не имею, каков более широкий контекст вашего кода, но вы можете попробовать добавить итератор в итоговый список. как это может быть?
return iter(sorted(dict.iteritems()))
конечно, теперь вы будете возвращать кортежи, потому что сортировка превратила ваш диктат в список кортежей
ex: скажем, ваш dict был:
{'a':1,'c':3,'b':2}
sorted превращает его в список:
[('a',1),('b',2),('c',3)]
поэтому, когда вы на самом деле перебираете список, вы получаете (в этом примере) кортеж, состоящий из строки и целого числа, но, по крайней мере, вы сможете перебирать его.
Предполагая, что вы используете CPython 2.x и имеете большой словарь mydict, использование sorted (mydict) будет медленным, потому что sorted создает отсортированный список ключей mydict.
В этом случае вы, возможно, захотите взглянуть на мой пакет orderdict, который включает реализацию C sorteddict
на языке C. Особенно, если вам приходится просматривать отсортированный список ключей несколько раз на разных этапах (т. Е. Количество элементов) времени жизни словарей.
.items()
вместоiteritems()
: как сказал @Claudiu, iteritems не работает для Python 3.x, ноitems()
доступен из Python 2.6.