Jeśli jest to a OrderedDict()
, możesz łatwo uzyskać dostęp do elementów, indeksując je, pobierając krotki par (klucz, wartość) w następujący sposób
>>> import collections
>>> d = collections.OrderedDict()
>>> d['foo'] = 'python'
>>> d['bar'] = 'spam'
>>> d.items()
[('foo', 'python'), ('bar', 'spam')]
>>> d.items()[0]
('foo', 'python')
>>> d.items()[1]
('bar', 'spam')
Uwaga dotycząca języka Python 3.X
dict.items
zwróci raczej iterowalny obiekt widoku dyktowania niż listę. Musimy zawinąć wywołanie do listy, aby umożliwić indeksowanie
>>> items = list(d.items())
>>> items
[('foo', 'python'), ('bar', 'spam')]
>>> items[0]
('foo', 'python')
>>> items[1]
('bar', 'spam')
items
metoda zwraca raczej obiekt widoku słownika, a nie listę, i nie obsługuje dzielenia ani indeksowania. Więc najpierw musiałbyś przekształcić go w listę. docs.python.org/3.3/library/stdtypes.html#dict-viewslist(d.items())
list(d.items())
, używającnext(islice(d.items(), 1))
polecenia get('bar', 'spam')
Czy musisz używać OrderedDict, czy konkretnie chcesz, aby typ podobny do mapy był uporządkowany w jakiś sposób z szybkim indeksowaniem pozycyjnym? Jeśli to drugie, rozważ jeden z wielu posortowanych typów dykt w Pythonie (który porządkuje pary klucz-wartość na podstawie kolejności sortowania kluczy). Niektóre implementacje obsługują również szybkie indeksowanie. Na przykład projekt sortedcontainers ma typ SortedDict tylko do tego celu.
źródło
SortedDict
z kluczową funkcją, aby uniknąć porównań. Jak:SortedDict(lambda key: 0, ...)
. Klucze zostaną wówczas nieposortowane, ale pozostaną w stabilnej kolejności i będą indeksowane.Oto szczególny przypadek, jeśli chcesz, aby pierwszy wpis (lub blisko niego) w OrderedDict, bez tworzenia listy. (To zostało zaktualizowane do Pythona 3):
(Kiedy pierwszy raz powiesz „następny ()”, tak naprawdę oznacza „pierwszy”).
W moim nieformalnym teście
next(iter(d.items()))
z małym OrderedDict jest tylko odrobinę szybszy niżitems()[0]
. Z OrderedDict wynoszącym 10000 wpisównext(iter(d.items()))
był około 200 razy szybszy niżitems()[0]
.ALE jeśli zapiszesz listę items () raz, a następnie będziesz jej często używać, może to być szybsze. Lub jeśli wielokrotnie {tworzysz iterator items () i przechodzisz przez to do żądanej pozycji}, może to być wolniejsze.
źródło
OrderedDict
s nie mająiteritems()
sposobu, więc trzeba będzie wykonać następujące czynności w celu uzyskania pierwszego elementu:next(iter(d.items()))
.d.items()
nie wydaje się być iteratorem, więc iter z przodu nie pomoże? Nadal zwróci pełną listę :(odict_iterator
i zostało mi potwierdzone na IRC #python, że to nie tworzy kopii listy.Znacznie bardziej wydajne jest użycie IndexedOrderedDict z
indexed
pakietu.Idąc za komentarzem Niklasa, przeprowadziłem test porównawczy na OrderedDict i IndexedOrderedDict z 1000 wpisów.
IndexedOrderedDict jest ~ 100 razy szybsze w indeksowaniu elementów w określonej pozycji w tym konkretnym przypadku.
źródło
indexed.py
zamiastindexed
.To wiki społeczności próbuje zebrać istniejące odpowiedzi.
Python 2.7
W python 2,
keys()
,values()
orazitems()
funkcjiOrderedDict
list powrotów. Navalues
przykład najprostszy sposób toW przypadku dużych zbiorów, w którym tylko zależy na pojedynczym wskaźniku, można uniknąć tworzenia pełną listę używając wersji generatora
iterkeys
,itervalues
iiteritems
:Indexed.py pakiet zapewnia
IndexedOrderedDict
, który jest przeznaczony dla tego przypadku użycia i będzie najszybszym rozwiązaniem.Korzystanie z itervalues może być znacznie szybsze w przypadku dużych słowników z dostępem swobodnym:
Python 3.6.0
Python 3 ma te same dwie podstawowe opcje (list vs generator), ale metody dict domyślnie zwracają generatory.
Metoda listy:
Metoda generatora:
Słowniki Python 3 są o rząd wielkości szybsze niż Python 2 i mają podobne przyspieszenia przy korzystaniu z generatorów.
źródło
Nadeszła nowa era, a słowniki Pythona 3.6.1 zachowują swoją kolejność. Te semantyki nie są wyraźne, ponieważ wymagałoby to zatwierdzenia BDFL. Ale Raymond Hettinger jest następną najlepszą rzeczą (i zabawniejszą) i przedstawia całkiem mocne argumenty, że słowniki będą zamawiane przez bardzo długi czas.
Więc teraz łatwo jest tworzyć wycinki słownika:
Uwaga: Zachowywanie kolejności reklam Dictonary jest teraz oficjalne w Pythonie 3.7 .
źródło
dla OrderedDict () można uzyskać dostęp do elementów poprzez indeksowanie, pobierając krotki par (klucz, wartość) w następujący sposób lub używając '.values ()'
źródło