Istnieje istniejąca funkcja, która kończy się następująco, gdzie d
jest słownik:
return d.iteritems()
, która zwraca niesortowany iterator dla danego słownika. Chciałbym zwrócić iterator, który przechodzi przez pozycje posortowane według klucza . W jaki sposób mogę to zrobić?
python
sorting
dictionary
mikrofon
źródło
źródło
.items()
zamiastiteritems()
: jak powiedział @Claudiu, iterity nie działają dla Python 3.x, aleitems()
są dostępne z Python 2.6.items()
tworzy listę i dlatego używa pamięci, podczas gdyiteritems()
zasadniczo nie używa pamięci. Czego używać zależy głównie od wielkości słownika. Ponadto automatyczne narzędzie do konwersji Python 2 na Python 3 (2to3
) automatycznie zajmuje się konwersją ziteritems()
naitems()
, więc nie musisz się tym martwić.collections.OrderedDict
następnie sortujesz raz i zawsze otrzymujesz przedmioty w posortowanej kolejności.iteritems()
nie używa pamięci, wszystko musi zostać wciągnięte do pamięcisorted()
, więc nie ma różnicy między użytkowaniemitems()
iiteritems()
tutaj pod względem pamięci.items()
(na liście zwróconej przezitems()
i na posortowanej liście) i tylko raz za pomocąiteritems()
(tylko na posortowanej liście).Użyj
sorted()
funkcji:Jeśli chcesz rzeczywistego iteratora nad posortowanymi wynikami, ponieważ
sorted()
zwraca listę, użyj:źródło
Klucze dykta są przechowywane w tablicy hasht, więc jest to ich „naturalny porządek”, tzn. Psuedo-random. Każde inne zamówienie jest koncepcją konsumenta dykta.
sorted () zawsze zwraca listę, a nie dykt. Jeśli przekażesz mu dict.items () (który tworzy listę krotek), zwróci listę krotek [(k1, v1), (k2, v2), ...], których można użyć w pętli w sposób bardzo podobny do dykt, ale w żadnym wypadku nie jest to dykt !
Poniższe wygląda jak dykta w pętli, ale tak nie jest, to lista krotek rozpakowywanych do k, v:
Z grubsza odpowiada:
źródło
sorted(foo.keys())
jest lepszy jako odpowiedniksorted(foo)
, ponieważ słowniki zwracają klucze po zakończeniu iteracji (z tą zaletą, że może nie być zmuszone do utworzeniafoo.keys()
listy pośredniej, w zależności od sposobusorted()
implementacji iteracji).k in sorted(foo.keys()):
która wyciąga klucze lubfor k,v in sorted(foo.items()):
która zwraca kopię par listy słownika, zgadujęsorted(foo.keys())
Odpowiedź Grega jest słuszna. Zauważ, że w Python 3.0 musisz to zrobić
jak
iteritems
zniknie.źródło
Możesz teraz używać również
OrderedDict
w Pythonie 2.7:Tutaj masz nową stronę dla wersji 2.7 i interfejs API OrdersDict .
źródło
Zasadniczo można sortować taki dyktat:
W konkretnym przypadku w pytaniu, mając „spadek zastępowania” dla d.iteritems (), dodaj funkcję:
i tak zmienia się linia końcowa
do
lub
źródło
Ta metoda wciąż ma sortowanie O (N log N), jednak po krótkim liniowym rozsypywaniu zwraca elementy w posortowanej kolejności, dzięki czemu teoretycznie jest bardziej wydajna, gdy nie zawsze potrzebujesz całej listy.
źródło
Jeśli chcesz sortować według kolejności wstawiania elementów zamiast kolejności kluczy, zajrzyj do kolekcji Pythona . (Tylko Python 3)
źródło
sorted zwraca listę, stąd błąd, gdy próbujesz iterować nad nią, ale ponieważ nie możesz zamówić nagrania, będziesz musiał poradzić sobie z listą.
Nie mam pojęcia, jaki jest większy kontekst twojego kodu, ale możesz spróbować dodać iterator do wynikowej listy. może tak ?:
oczywiście będziesz teraz wracał krotki, ponieważ posortowane zmieniło twój dyktat w listę krotek
np. powiedz, że twój dykt:
{'a':1,'c':3,'b':2}
posortowany zamienia go w listę:więc kiedy faktycznie wykonasz iterację po liście, otrzymasz (w tym przykładzie) krotkę złożoną z łańcucha i liczby całkowitej, ale przynajmniej będziesz w stanie iterować po niej.
źródło
Zakładając, że używasz CPython 2.x i masz duży słownik mydict, to użycie sortowania (mydict) będzie wolne, ponieważ sortowane tworzy posortowaną listę kluczy mydict.
W takim przypadku możesz zajrzeć do mojego pakietu uporządkowanego, który zawiera implementację C
sorteddict
w C. Szczególnie, jeśli musisz wielokrotnie przeglądać posortowaną listę kluczy na różnych etapach (tj. Liczbie elementów) życia słowników.http://anthon.home.xs4all.nl/Python/ordereddict/
źródło