it-swarm.com.de

Wie kann ich ein Wörterbuch nach Schlüssel sortieren?

Was wäre ein schöner Weg von {2:3, 1:89, 4:5, 3:0} zu {1:89, 2:3, 3:0, 4:5}?
Ich habe einige Posts überprüft, aber alle verwenden den "sortierten" Operator, der Tupel zurückgibt. 

714
achrysochoou

Standard-Python-Wörterbücher sind nicht geordnet. Selbst wenn Sie die Paare (Schlüssel, Wert) sortieren, können Sie sie nicht in einer dict so speichern, dass die Reihenfolge erhalten bleibt.

Der einfachste Weg ist die Verwendung von OrderedDict , die die Reihenfolge speichert, in der die Elemente eingefügt wurden:

In [1]: import collections

In [2]: d = {2:3, 1:89, 4:5, 3:0}

In [3]: od = collections.OrderedDict(sorted(d.items()))

In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])

Egal, wie od ausgedruckt wird; es wird wie erwartet funktionieren:

In [11]: od[1]
Out[11]: 89

In [12]: od[3]
Out[12]: 0

In [13]: for k, v in od.iteritems(): print k, v
   ....: 
1 89
2 3
3 0
4 5

Python 3

Für Python 3-Benutzer muss anstelle von .items().iteritems() verwendet werden:

In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5
774
NPE

Wörterbücher selbst haben keine Artikel als solche bestellt, wenn Sie sie in einer bestimmten Reihenfolge ausdrucken möchten, hier einige Beispiele:

In Python 2.4 und höher:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

for key in sorted(mydict):
    print "%s: %s" % (key, mydict[key])

gibt:

alan: 2
bob: 1
carl: 40
danny: 3

(Python unter 2.4 :)

keylist = mydict.keys()
keylist.sort()
for key in keylist:
    print "%s: %s" % (key, mydict[key])

Quelle: http://www.saltycrane.com/blog/2007/09/wie-nach-sort-python-dictionary-by-keys/

368
James

Aus Python's collections Bibliotheksdokumentation :

>>> from collections import OrderedDict

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'Apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('Apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('Apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('Apple', 4), ('orange', 2), ('banana', 3)])
179
Dennis

Für Python3.6 + ist dies einfach möglich mit:

>>> d = {2:3, 1:89, 4:5, 3:0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}
50
Dipu

Es gibt eine Reihe von Python-Modulen, die Wörterbuchimplementierungen bereitstellen, die die Schlüssel automatisch in sortierter Reihenfolge verwalten. Betrachten Sie das Modul sortedcontainers , das reine Python- und Fast-as-C-Implementierungen ist. Es gibt auch einen Leistungsvergleich mit anderen populären Optionen, die miteinander verglichen werden.

Die Verwendung eines geordneten Diktiers ist eine unzulängliche Lösung, wenn Sie ständig Schlüssel-Wert-Paare hinzufügen und entfernen müssen, während Sie gleichzeitig iterieren.

>>> from sortedcontainers import SortedDict
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> s = SortedDict(d)
>>> s.items()
[(1, 89), (2, 3), (3, 0), (4, 5)]

Der SortedDict-Typ unterstützt auch das Suchen und Löschen von indizierten Positionen, was mit dem integrierten Dict-Typ nicht möglich ist.

>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])
37
GrantJ

Einfach:

d = {2:3, 1:89, 4:5, 3:0}
sd = sorted(d.items())

for k,v in sd:
    print k, v

Ausgabe:

1 89
2 3
3 0
4 5
24
user3769249

Wie andere bereits erwähnt haben, sind Wörterbücher von Natur aus ungeordnet. Wenn das Problem jedoch nur Anzeige - Wörterbücher in einer geordneten Weise ist, können Sie die __str__-Methode in einer Wörterbuch-Unterklasse überschreiben und diese Wörterbuchklasse anstelle der eingebauten dict verwenden. Z.B.

class SortedDisplayDict(dict):
   def __str__(self):
       return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"


>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}

Beachten Sie, dass dies nichts an der Art und Weise ändert, wie die Schlüssel gespeichert werden, die Reihenfolge, in der sie wiedergegeben werden, wenn Sie über sie iterieren usw., nur wie sie mit print oder an der Python-Konsole angezeigt werden.

23
Brian

Einen anderen Weg gefunden:

import json
print json.dumps(d, sort_keys = True)

upd:
1. Dadurch werden auch verschachtelte Objekte sortiert (danke @DanielF).
2. Python-Wörterbücher sind nicht geordnet, daher kann dies nur zum Drucken oder zum Zuweisen von str.

15
tschesseket

In Python 3. 

>>> D1 = {2:3, 1:89, 4:5, 3:0}
>>> for key in sorted(D1):
    print (key, D1[key])

gibt

1 89
2 3
3 0
4 5
14

Hier fand ich eine einfachste Lösung, um das Python-Diktat mit pprint

>>> x = {'a': 10, 'cd': 20, 'b': 30, 'az': 99} 
>>> print x
{'a': 10, 'b': 30, 'az': 99, 'cd': 20}

bei der Verwendung von pprint wird ein sortiertes Diktat ausgegeben

>>> import pprint 
>>> pprint.pprint(x)
{'a': 10, 'az': 99, 'b': 30, 'cd': 20}
10
Atul Arvind

Das Python-Wörterbuch war vor Python 3.6 nicht geordnet. Bei der CPython-Implementierung von Python 3.6 behält das Wörterbuch die Einfügereihenfolge bei . Ab Python 3.7 wird dies zu einer Sprachfunktion.

Wenn Sie ein verschachteltes Diktat einschließlich des darin enthaltenen Subdikts sortieren möchten, können Sie Folgendes tun:

test_dict = {'a': 1, 'c': 3, 'b': {'b2': 2, 'b1': 1}}

def dict_reorder(item):
    return {k: sort_dict(v) if isinstance(v, dict) else v for k, v in sorted(item.items())}

reordered_dict = dict_reorder(test_dict)

https://Gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb

7
Guangyang Li

Es gibt eine einfache Möglichkeit, ein Wörterbuch zu sortieren.

Ihrer Frage entsprechend

Die Lösung ist :

c={2:3, 1:89, 4:5, 3:0}
y=sorted(c.items())
print y

(Dabei ist c der Name Ihres Wörterbuchs.)

Dieses Programm liefert folgende Ausgabe:

[(1, 89), (2, 3), (3, 0), (4, 5)]

wie du wolltest.

Ein anderes Beispiel ist:

d={"John":36,"Lucy":24,"Albert":32,"Peter":18,"Bill":41}
x=sorted(d.keys())
print x

Gibt die Ausgabe aus: ['Albert', 'Bill', 'John', 'Lucy', 'Peter']

y=sorted(d.values())
print y

Gibt die Ausgabe aus: [18, 24, 32, 36, 41]

z=sorted(d.items())
print z

Gibt die Ausgabe aus:

[('Albert', 32), ('Bill', 41), ('John', 36), ('Lucy', 24), ('Peter', 18)]

Indem Sie es in Schlüssel, Werte und Elemente umwandeln, können Sie wie gewünscht drucken.

6
Sree

Erzeugt genau das, was du willst: 

 D1 = {2:3, 1:89, 4:5, 3:0}

 sort_dic = {}

 for i in sorted(D1):
     sort_dic.update({i:D1[i]})
 print sort_dic


{1: 89, 2: 3, 3: 0, 4: 5}

Dies ist jedoch nicht der Schreibweg, da dies ein unterschiedliches Verhalten mit verschiedenen Wörterbüchern zeigen könnte. Daher wurde von Tim in der Antwort meiner Anfrage, die ich hier teile, der perfekte Weg vorgeschlagen.

from collections import OrderedDict
sorted_dict = OrderedDict(sorted(D1.items(), key=lambda t: t[0]))
5
jax

Sie können ein neues Wörterbuch erstellen, indem Sie das aktuelle Wörterbuch nach Schlüssel entsprechend Ihrer Frage sortieren.

Dies ist dein Wörterbuch

d = {2:3, 1:89, 4:5, 3:0}

Erstellen Sie ein neues Wörterbuch d1, indem Sie dieses mit der Lambda-Funktion sortieren

d1 = dict(sorted(d.items(), key = lambda x:x[0]))

d1 sollte {1: 89, 2: 3, 3: 0, 4: 5} sein, sortiert nach Schlüsseln in d.

4
Amit Prafulla

Python-Diktate sind ungeordnet. Normalerweise ist dies kein Problem, da der häufigste Anwendungsfall das Nachschlagen ist. 

Der einfachste Weg, um das zu tun, was Sie möchten, besteht darin, einen collections.OrderedDict zu erstellen, der die Elemente in sortierter Reihenfolge einfügt.

ordered_dict = collections.OrderedDict([(k, d[k]) for k in sorted(d.keys())])

Wenn Sie iterieren müssen, wie andere oben vorgeschlagen haben, besteht der einfachste Weg darin, über sortierte Schlüssel zu iterieren. Beispiele-

Druckwerte nach Schlüsseln sortiert:

# create the dict
d = {k1:v1, k2:v2,...}
# iterate by keys in sorted order
for k in sorted(d.keys()):
    value = d[k]
    # do something with k, value like print
    print k, value

Liste der Werte nach Schlüsseln sortiert abrufen:

values = [d[k] for k in sorted(d.keys())]
4

Ich denke, das einfachste ist, das Diktier nach Schlüssel zu sortieren und das sortierte Schlüssel zu speichern: Wertepaar in einem neuen Diktat.

dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2} 
dict2 = {}                  # create an empty dict to store the sorted values
for key in sorted(dict1.keys()):
    if not key in dict2:    # Depending on the goal, this line may not be neccessary
        dict2[key] = dict1[key]

Um es klarer zu machen:

dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2} 
dict2 = {}                  # create an empty dict to store the sorted     values
for key in sorted(dict1.keys()):
    if not key in dict2:    # Depending on the goal, this line may not be  neccessary
        value = dict1[key]
        dict2[key] = value
4
lallolu

Ich habe eine Einzelsignatur-Diktiersortierung. 

>> a = {2:3, 1:89, 4:5, 3:0}
>> c = {i:a[i] for i in dict.fromkeys(sorted([i for i in a]))}
>> print(c)
{1: 89, 2: 3, 3: 0, 4: 5}
[Finished in 0.4s]

Hoffe das wird hilfreich sein. 

1

Die einfachste Lösung ist, dass Sie eine Liste der Diktierschlüssel erhalten, deren Reihenfolge sortiert ist und dann über Diktate iterieren. Zum Beispiel

a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30}
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True)
for r in a1_sorted_keys:
    print r, a1[r]

Nachfolgend die Ausgabe (Reihenfolge)

e 30
b 13
d 4
c 2
a 1
0
Shafiq

Ein Timing-Vergleich der beiden Methoden in 2.7 zeigt, dass sie praktisch identisch sind:

>>> setup_string = "a = sorted(dict({2:3, 1:89, 4:5, 3:0}).items())"
>>> timeit.timeit(stmt="[(k, val) for k, val in a]", setup=setup_string, number=10000)
0.003599141953657181

>>> setup_string = "from collections import OrderedDict\n"
>>> setup_string += "a = OrderedDict({1:89, 2:3, 3:0, 4:5})\n"
>>> setup_string += "b = a.items()"
>>> timeit.timeit(stmt="[(k, val) for k, val in b]", setup=setup_string, number=10000)
0.003581275490432745 
0
Jesuisme

Jungs, du machst die Dinge kompliziert ... es ist wirklich einfach

from pprint import pprint
Dict={'B':1,'A':2,'C':3}
pprint(Dict)

Die Ausgabe ist:

{'A':2,'B':1,'C':3}
0
Derick Fdo

Oder benutze pandas,

Demo:

>>> d={'B':1,'A':2,'C':3}
>>> df=pd.DataFrame(d,index=[0]).sort_index(axis=1)
   A  B  C
0  2  1  3
>>> df.to_dict('int')[0]
{'A': 2, 'B': 1, 'C': 3}
>>> 

Sehen:

Dokumente davon

Dokumentation von ganzen Pandas

0
U9-Forward
dictionary = {1:[2],2:[],5:[4,5],4:[5],3:[1]}

temp=sorted(dictionary)
sorted_dict = dict([(k,dictionary[k]) for i,k in enumerate(temp)])

sorted_dict:
         {1: [2], 2: [], 3: [1], 4: [5], 5: [4, 5]}
0
Mahdi Ghelichi

Ein anderer pythonischer Ansatz wäre

def sort_dict(my_dict):
    return sorted(my_dict.items(), key=lambda x :x[1])


0
E. Dogan
from operator import itemgetter
# if you would like to play with multiple dictionaries then here you go:
# Three dictionaries that are composed of first name and last name.
user = [
    {'fname': 'Mo', 'lname': 'Mahjoub'},
    {'fname': 'Abdo', 'lname': 'Al-hebashi'},
    {'fname': 'ALi', 'lname': 'Muhammad'}
]
#  This loop will sort by the first and the last names.
# notice that in a dictionary order doesn't matter. So it could put the first name first or the last name first. 
for k in sorted (user, key=itemgetter ('fname', 'lname')):
    print (k)

# This one will sort by the first name only.
for x in sorted (user, key=itemgetter ('fname')):
    print (x)
0