Qual seria uma boa maneira de passar de {2:3, 1:89, 4:5, 3:0}
para {1:89, 2:3, 3:0, 4:5}
?
Eu verifiquei algumas postagens, mas todas elas usam o operador "classificado" que retorna tuplas.
python
sorting
dictionary
Antony
fonte
fonte
Respostas:
Os dicionários Python padrão não são ordenados. Mesmo se você classificasse os pares (chave, valor), não seria possível armazená-los de
dict
uma maneira que preservasse a ordem.A maneira mais fácil é usar
OrderedDict
, que lembra a ordem na qual os elementos foram inseridos:Não importa o modo como
od
está impresso; funcionará como esperado:Python 3
Para usuários do Python 3, é necessário usar o em
.items()
vez de.iteritems()
:fonte
sorted_dict = dict(sorted(unsorted_dict.items()))
Os próprios dicionários não possuem itens solicitados como tal, caso você queira imprimi-los etc. em alguma ordem, aqui estão alguns exemplos:
No Python 2.4 e acima:
dá:
(Python abaixo de 2,4 :)
Fonte: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
fonte
for key, value in sorted(mydict.items())"
Na documentação da
collections
biblioteca do Python :fonte
reverse=True
por exemploOrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))
Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
Para o CPython / PyPy 3.6 e qualquer Python 3.7 ou superior, isso é feito facilmente com:
fonte
{key:d[key] for key in sorted(d.keys())}
Existem vários módulos Python que fornecem implementações de dicionário que mantêm automaticamente as chaves na ordem de classificação. Considere o módulo de contêineres classificados , que é uma implementação pura em Python e rápida como C. Há também uma comparação de desempenho com outras opções populares comparadas entre si.
Usar um ditado ordenado é uma solução inadequada se você precisar adicionar e remover constantemente pares de chave / valor enquanto também itera.
O tipo SortedDict também suporta pesquisas e exclusão de locais indexados, o que não é possível com o tipo de dict interno.
fonte
Simplesmente:
Resultado:
fonte
sd
é uma lista de tuplas, não um dicionário. (embora ainda útil.)Como outros mencionaram, os dicionários são inerentemente desordenados. No entanto, se o problema estiver apenas exibindo dicionários de maneira ordenada, você poderá substituir o
__str__
método em uma subclasse de dicionário e usar essa classe de dicionário em vez do incorporadodict
. Por exemplo.Observe que isso não muda nada sobre como as chaves são armazenadas, a ordem em que elas voltarão quando você iterar sobre elas, etc., exatamente como elas são exibidas
print
no console do python ou no console.fonte
Encontrou outra maneira:
upd:
1. isso também classifica objetos aninhados (obrigado @DanielF).
2. Os dicionários python não são ordenados, portanto, é possível imprimir ou atribuir apenas a str.
fonte
No Python 3.
dá
fonte
O dicionário Python não era ordenado antes do Python 3.6. Na implementação do Python 3.6 do CPython, o dicionário mantém a ordem de inserção. A partir do Python 3.7, isso se tornará um recurso de linguagem.
No log de alterações do Python 3.6 ( https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-compactdict ):
No documento do Python 3.7 ( https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries ):
Portanto, diferente das versões anteriores, você pode classificar um ditado após o Python 3.6 / 3.7. Se você deseja classificar um dict aninhado, incluindo o subdict dentro, é possível:
https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb
fonte
Aqui encontrei uma solução mais simples para classificar o ditado python por chave usando
pprint
. por exemplo.mas enquanto estiver usando o pprint, ele retornará o ditado classificado
fonte
Existe uma maneira fácil de classificar um dicionário.
De acordo com sua pergunta,
A solução é :
(Onde c, é o nome do seu dicionário.)
Este programa fornece a seguinte saída:
como você queria.
Outro exemplo é:
Dá a saída:
['Albert', 'Bill', 'John', 'Lucy', 'Peter']
Dá a saída:
[18, 24, 32, 36, 41]
Dá a saída:
Por isso, alterando-o em chaves, valores e itens, você pode imprimir como o que você queria.
fonte
Gerará exatamente o que você deseja:
Mas essa não é a maneira correta de fazer isso, porque, poderia mostrar um comportamento distinto com diferentes dicionários, que aprendi recentemente. Por isso, Tim sugeriu o caminho perfeito na resposta da minha consulta que estou compartilhando aqui.
fonte
Acho que a coisa mais fácil é classificar o ditado por chave e salvar a chave classificada: par de valores em um novo ditado.
Para tornar mais claro:
fonte
Você pode criar um novo dicionário, classificando o dicionário atual por chave, conforme sua pergunta.
Este é o seu dicionário
Crie um novo dicionário d1 classificando este d usando a função lambda
d1 deve ser {1: 89, 2: 3, 3: 0, 4: 5}, classificado com base nas chaves em d.
fonte
Os dictos Python não são ordenados. Normalmente, isso não é um problema, pois o caso de uso mais comum é fazer uma pesquisa.
A maneira mais simples de fazer o que você deseja seria criar uma
collections.OrderedDict
inserção dos elementos na ordem de classificação.Se você precisar iterar, como sugeriram outros acima, a maneira mais simples seria iterar sobre as chaves classificadas. Exemplos-
Imprimir valores classificados por chaves:
Obter lista de valores classificados por chaves:
fonte
for k,value in sorted(d.items()):
é melhor: evita acessar o ditado por chave novamente no loopEu venho com uma classificação de ditado de linha única.
Espero que isso seja útil.
fonte
Esta função classifica qualquer dicionário recursivamente por sua chave. Ou seja, se algum valor no dicionário também for um dicionário, ele também será classificado por sua chave. Se você estiver executando no CPython 3.6 ou superior, é possível fazer uma simples alteração para usar um em
dict
vez de umOrderedDict
.fonte
Gente, você está complicando as coisas ... é bem simples
A saída é:
fonte
A solução mais simples é que você deve obter uma lista da ordem de classificação do dict e depois iterar sobre o dict. Por exemplo
A seguir, será apresentada a saída (ordem de pedido)
fonte
Uma maneira fácil de fazer isso:
fonte
Uma comparação de tempo dos dois métodos no 2.7 mostra que eles são praticamente idênticos:
fonte
fonte
fonte
Ou use
pandas
,Demo:
Vejo:
fonte
Minha sugestão é essa, pois permite que você ordene um ditado ou mantenha um ditado classificado enquanto adiciona itens e pode precisar adicionar itens no futuro:
Construa a
dict
partir do zero à medida que avança. Tenha uma segunda estrutura de dados, uma lista, com sua lista de chaves. O pacote bisect possui uma função de classificação, que permite inserir em uma lista classificada ou classificar sua lista após preencher completamente seu ditado. Agora, quando você itera sobre seu ditado, em vez disso, itera sobre a lista para acessar cada chave de maneira ordenada, sem se preocupar com a representação da estrutura do dict (que não foi feita para classificação).fonte
fonte