Jaki byłby to dobry sposób, aby przejść od {2:3, 1:89, 4:5, 3:0}
do {1:89, 2:3, 3:0, 4:5}
?
Sprawdziłem niektóre posty, ale wszystkie używają operatora „posortowanego”, który zwraca krotki.
python
sorting
dictionary
Antony
źródło
źródło
Odpowiedzi:
Standardowe słowniki w języku Python są nieuporządkowane. Nawet jeśli posortujesz pary (klucz, wartość), nie będziesz w stanie przechowywać ich w
dict
sposób, który zachowałby porządek.Najprostszym sposobem jest użycie
OrderedDict
, które pamięta kolejność wstawiania elementów:Nieważne, jak
od
jest wydrukowany; będzie działać zgodnie z oczekiwaniami:Python 3
W przypadku użytkowników Python 3 należy użyć
.items()
zamiast.iteritems()
:źródło
sorted_dict = dict(sorted(unsorted_dict.items()))
Same słowniki nie mają jako takich uporządkowanych elementów, jeśli chcesz je wydrukować itp. W określonym porządku, oto kilka przykładów:
W Pythonie 2.4 i nowszych:
daje:
(Python poniżej 2.4 :)
Źródło: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-dictionary-by-keys/
źródło
for key, value in sorted(mydict.items())"
Z dokumentacji biblioteki Pythona
collections
:źródło
reverse=True
np.OrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))
Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
W przypadku CPython / PyPy 3.6 i dowolnego Pythona 3.7 lub nowszego można to łatwo zrobić za pomocą:
źródło
{key:d[key] for key in sorted(d.keys())}
Istnieje wiele modułów Python, które zapewniają implementacje słownikowe, które automatycznie utrzymują klucze w posortowanej kolejności. Rozważ moduł sortedcontainers , który jest implementacją czysto Python i Fast-as-C. Istnieje również porównanie wydajności z innymi popularnymi opcjami porównanymi ze sobą.
Korzystanie z zamówionego dykta jest nieodpowiednim rozwiązaniem, jeśli trzeba stale dodawać i usuwać pary klucz / wartość, a także iterować.
Typ SortedDict obsługuje również indeksowane wyszukiwanie i usuwanie lokalizacji, co nie jest możliwe w przypadku wbudowanego typu dict.
źródło
Po prostu:
Wynik:
źródło
sd
to lista krotek, a nie słownik. (wciąż przydatne).Jak wspomnieli inni, słowniki są z natury nieuporządkowane. Jeśli jednak problemem jest jedynie wyświetlanie słowników w uporządkowany sposób, można zastąpić
__str__
metodę w podklasie słownika i użyć tej klasy słownika zamiast wbudowanejdict
. Na przykład.Zauważ, że nie zmienia to niczego w sposobie przechowywania kluczy, kolejności, w której powrócą podczas iteracji nad nimi itp., W jaki sposób są wyświetlane za pomocą
print
lub w konsoli Pythona.źródło
Znaleziono inny sposób:
upd:
1. sortuje również zagnieżdżone obiekty (dzięki @DanielF).
2. Słowniki python są nieuporządkowane, dlatego można je drukować lub przypisywać tylko do str.
źródło
W Python 3.
daje
źródło
Słownik Pythona był nieuporządkowany przed Pythonem 3.6. W implementacji CPython w Pythonie 3.6 słownik zachowuje kolejność wstawiania. Od wersji Python 3.7 będzie to funkcja językowa.
W dzienniku zmian Pythona 3.6 ( https://docs.python.org/3.6/whatsnew/3.6.html#whatsnew36-compactdict ):
W dokumencie Python 3.7 ( https://docs.python.org/3.7/tutorial/datastructures.html#dictionaries ):
Tak więc, w przeciwieństwie do poprzednich wersji, możesz posortować słownik po Pythonie 3.6 / 3.7. Jeśli chcesz posortować zagnieżdżony dykt, w tym sub-dykt wewnątrz, możesz:
https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb
źródło
Tutaj znalazłem najprostsze rozwiązanie do sortowania słownika python według klucza za pomocą
pprint
. na przykład.ale podczas używania pprint zwróci posortowane dict
źródło
Istnieje prosty sposób na posortowanie słownika.
Zgodnie z twoim pytaniem
Rozwiązaniem jest :
(Gdzie c to nazwa twojego słownika.)
Ten program daje następujące dane wyjściowe:
tak jak chciałeś.
Innym przykładem jest:
Daje wynik:
['Albert', 'Bill', 'John', 'Lucy', 'Peter']
Daje wynik:
[18, 24, 32, 36, 41]
Daje wynik:
Dlatego zmieniając go w klucze, wartości i elementy, możesz drukować tak, jak chcesz. Mam nadzieję, że to pomaga!
źródło
Wygeneruje dokładnie to, co chcesz:
Ale to nie jest właściwy sposób, aby to zrobić, ponieważ może wykazywać wyraźne zachowanie z różnymi słownikami, których niedawno się nauczyłem. Dlatego w odpowiedzi na moje zapytanie, które tu udostępniam, Tim zaproponował doskonały sposób.
źródło
Myślę, że najłatwiej jest posortować dyktowanie według klucza i zapisać posortowaną parę klucz: wartość w nowym dykcie.
Aby było to jaśniejsze:
źródło
Możesz utworzyć nowy słownik, sortując aktualny słownik według klucza zgodnie z pytaniem.
To jest twój słownik
Utwórz nowy słownik d1, sortując ten d za pomocą funkcji lambda
d1 powinno być {1: 89, 2: 3, 3: 0, 4: 5}, posortowane na podstawie kluczy z d.
źródło
Dykty w języku Python nie są uporządkowane. Zwykle nie stanowi to problemu, ponieważ najczęstszym przypadkiem użycia jest wyszukiwanie.
Najprostszym sposobem na zrobienie tego, co chcesz, byłoby utworzenie
collections.OrderedDict
wstawiania elementów w posortowanej kolejności.Jeśli potrzebujesz iteracji, jak sugerują inni powyżej, najprostszym sposobem byłoby iterowanie posortowanych kluczy. Przykłady
Wydrukuj wartości posortowane według kluczy:
Pobierz listę wartości posortowanych według kluczy:
źródło
for k,value in sorted(d.items()):
jest lepsze: unika dostępu do dykta po raz kolejny w pętliWymyślam sortowanie pojedynczych wierszy.
Mam nadzieję, że to będzie pomocne.
źródło
Ta funkcja posortuje rekursywnie dowolny słownik według jego klucza. Oznacza to, że jeśli jakakolwiek wartość w słowniku jest również słownikiem, również zostanie posortowana według klucza. Jeśli korzystasz z CPython 3.6 lub nowszego, możesz dokonać prostej zmiany,
dict
zamiast używaniaOrderedDict
.źródło
Faceci, których komplikujecie ... to naprawdę proste
Dane wyjściowe to:
źródło
Najprostszym rozwiązaniem jest wyświetlenie listy kluczy do sortowania w kolejności sortowania, a następnie iteracji po dyktowaniu. Na przykład
Następujące będzie wyjście (kolejność wycofywania)
źródło
Łatwy sposób to zrobić:
źródło
Porównanie czasowe dwóch metod w 2.7 pokazuje, że są one praktycznie identyczne:
źródło
źródło
źródło
Albo użyj
pandas
,Próbny:
Widzieć:
źródło
Moja sugestia jest taka, ponieważ umożliwia sortowanie nagrania lub utrzymywanie go w porządku podczas dodawania elementów i może być konieczne dodanie elementów w przyszłości:
Zbuduj
dict
od zera w trakcie pracy. Mają drugą strukturę danych, listę z listą kluczy. Pakiet bisect ma funkcję insort, która umożliwia wstawianie do posortowanej listy lub sortowanie listy po całkowitym zapełnieniu słownika. Teraz, gdy wykonujesz iterację po swoim dyktando, zamiast tego iterujesz po liście, aby uzyskać dostęp do każdego klucza w uporządkowany sposób, nie martwiąc się o reprezentację struktury dykt (która nie została stworzona do sortowania).źródło
źródło