Existe uma função existente que termina no seguinte, onde d
está um dicionário:
return d.iteritems()
que retorna um iterador não classificado para um determinado dicionário. Gostaria de retornar um iterador que percorre os itens classificados por chave . Como faço isso?
python
sorting
dictionary
Mike
fonte
fonte
.items()
vez deiteritems()
: como o @Claudiu disse, os iteritems não funcionam no Python 3.x, masitems()
estão disponíveis no Python 2.6.items()
cria uma lista e, portanto, usa memória, enquanto queiteritems()
essencialmente não usa memória. O que usar depende principalmente do tamanho do dicionário. Além disso, a ferramenta de conversão automática Python 2 para Python 3 (2to3
) cuida automaticamente da conversão deiteritems()
paraitems()
, então não há necessidade de se preocupar com isso.collections.OrderedDict
então você classifica uma vez e obtém os itens sempre na ordem de classificação.iteritems()
que não use memória, tudo deve ser puxado para a memóriasorted()
, para que não haja diferença entre o uso da memóriaitems()
eiteritems()
aqui.items()
(na lista retornada poritems()
e na lista classificada) e apenas uma vez comiteritems()
(apenas na lista classificada).Use a
sorted()
função:Se você deseja um iterador real sobre os resultados classificados, pois
sorted()
retorna uma lista, use:fonte
As chaves de um ditado são armazenadas em uma hashtable, de modo que essa é sua 'ordem natural', isto é, psuedo-random. Qualquer outra ordem é um conceito do consumidor do ditado.
classificado () sempre retorna uma lista, não um ditado. Se você passar um dict.items () (que produz uma lista de tuplas), ele retornará uma lista de tuplas [(k1, v1), (k2, v2), ...] que podem ser usadas em um loop de uma maneira muito parecida com um ditado, mas de modo algum é um ditado !
A seguir, parece um ditado em um loop, mas não é, é uma lista de tuplas sendo descompactadas em k, v:
Aproximadamente equivalente a:
fonte
sorted(foo.keys())
é melhor que o equivalentesorted(foo)
, já que os dicionários retornam suas chaves quando iterados (com a vantagem de não serem forçados a criar afoo.keys()
lista intermediária, talvez - dependendo de comosorted()
é implementado para iterables).k in sorted(foo.keys()):
que puxa as chaves oufor k,v in sorted(foo.items()):
que retorna uma cópia da lista de pares do dicionário eu achosorted(foo.keys())
A resposta de Greg está certa. Observe que no Python 3.0 você terá que fazer
como
iteritems
se foi.fonte
Agora você também pode usar o
OrderedDict
Python 2.7:Aqui você tem a nova que é página para 2,7 versão ea API OrderedDict .
fonte
Em geral, pode-se classificar um ditado assim:
Para o caso específico da pergunta, com uma "queda na substituição" de d.iteritems (), adicione uma função como:
e assim a linha final muda de
para
ou
fonte
Esse método ainda possui uma classificação O (N log N); no entanto, após um pequeno heapify linear, ele produz os itens na ordem de classificação conforme o andamento, tornando-o teoricamente mais eficiente quando você nem sempre precisa da lista inteira.
fonte
Se você deseja classificar pela ordem em que os itens foram inseridos, em vez da ordem das chaves, consulte as coleções do Python.OrderedDict . (Somente Python 3)
fonte
classificado retorna uma lista, daí o seu erro ao tentar iterá-lo, mas como você não pode ordenar um ditado, precisará lidar com uma lista.
Não faço ideia do contexto maior do seu código, mas você pode tentar adicionar um iterador à lista resultante. assim talvez ?:
é claro que você receberá de volta as tuplas agora porque classificadas transformou seu ditado em uma lista de tuplas
ex: diga que seu ditado era:
{'a':1,'c':3,'b':2}
classificado transforma-o em uma lista:portanto, quando você realmente itera sobre a lista, recebe (neste exemplo) uma tupla composta por uma string e um número inteiro, mas pelo menos você poderá iterar sobre ela.
fonte
Supondo que você esteja usando o CPython 2.xe possua um grande dicionário mydict, o uso de ordenado (mydict) será lento, porque ordenado cria uma lista ordenada das chaves do mydict.
Nesse caso, você pode querer olhar para o meu pacote ordersdict, que inclui uma implementação C de
sorteddict
em C. Especialmente se você precisar a lista classificada de chaves várias vezes em diferentes estágios (ou seja, número de elementos) da vida útil dos dicionários.http://anthon.home.xs4all.nl/Python/ordereddict/
fonte