Mam problemy z używaniem tej collections.OrderedDict
klasy. Używam Pythona 2.7 na Raspbian, dystrybucji Debiana dla Raspberry Pi. Próbuję wydrukować dwa słowniki w celu porównania (obok siebie) do przygody z tekstem. Kolejność jest niezbędna do dokładnego porównania. Bez względu na to, czego próbuję, słowniki drukują w zwykły, nieuporządkowany sposób.
Oto, co otrzymuję, robiąc to na moim RPi:
import collections
ship = {"NAME": "Albatross",
"HP":50,
"BLASTERS":13,
"THRUSTERS":18,
"PRICE":250}
ship = collections.OrderedDict(ship)
print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
Oczywiście coś jest nie tak, ponieważ wypisuje wywołanie funkcji i umieszcza klucze i grupy wartości w zagnieżdżonej liście ...
Oto, co otrzymałem, uruchamiając coś podobnego na moim komputerze:
import collections
Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}
#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)
print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])
Tym razem jest w porządku, ale nie powinno się drukować innych rzeczy, prawda? (Umieszczenie go na liście i pokazanie wywołania funkcji.)
Gdzie popełniam błąd? Nie powinno to mieć nic wspólnego z wersją pi Pythona, ponieważ jest to tylko wersja dla Linuksa.
źródło
OrderedDict
jest sortowany według kolejności reklamowej, a nie alfanumerycznej kolejności kluczy.Odpowiedzi:
Najpierw tworzysz słownik , a następnie przekazujesz go do pliku
OrderedDict
. W przypadku wersji Pythona <3.6 (*) , do czasu gdy to zrobisz, kolejność nie będzie już poprawna.dict
z natury nie jest uporządkowany.Zamiast tego podaj sekwencję krotek:
To, co widzisz, gdy drukujesz,
OrderedDict
jest jego reprezentacją i jest całkowicie poprawne.OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
po prostu pokazuje, w możliwej do odtworzenia reprezentacji, jaka jest zawartość plikuOrderedDict
.(*) : W implementacji CPython 3.6,
dict
typ został zaktualizowany, aby używać bardziej wydajnej pamięci wewnętrznej struktury, która ma szczęśliwy efekt uboczny w postaci zachowania kolejności wstawiania, a przez rozszerzenie kod pokazany w pytaniu działa bez problemów. Od wersji Python 3.7 specyfikacja języka Python została zaktualizowana, aby wymagać, aby wszystkie implementacje Pythona były zgodne z tym zachowaniem. Zobacz tę inną moją odpowiedź, aby uzyskać szczegółowe informacje, a także dlaczego nadal możesz chcieć użyćOrderedDict()
w niektórych przypadkach.źródło
print ship
?? Dzięki :)OrderedDict
jest tworzona to jest słownik.Jeśli nie możesz edytować tej części kodu, w której zdefiniowano twój dykt, nadal możesz go zamówić w dowolnym momencie w dowolny sposób, na przykład:
źródło
Przez większość czasu korzystamy z OrderedDict, gdy wymagaliśmy niestandardowego zamówienia, a nie ogólnego, takiego jak ASC itp.
Oto proponowane rozwiązanie:
To wyświetli:
Uwaga : Nowe posortowane słowniki zachowują porządek sortowania po usunięciu wpisów. Ale kiedy dodawane są nowe klucze, są one dołączane na końcu, a sortowanie nie jest utrzymywane. ( Oficjalny dokument )
źródło
Użyj dict.items (); może to być tak proste, jak:
źródło