Niewiele osób wydaje się, pomimo wielu odpowiedzi na to pytanie, wskazać, że słowniki są nieuporządkowanymi mapowaniami, a więc (aż do błogosławieństwa kolejności wstawiania w Pythonie 3.7) idea „pierwszego” hasła w słowniku dosłownie powstała bezsens. A nawet dostęp do pliku OrderedDict
można uzyskać tylko za pomocą indeksu liczbowego, używając takich brzydoty, jak mydict[mydict.keys()[0]]
(tylko Python 2, ponieważ w Pythonie 3 keys()
jest iteratorem nieskryptowalnym).
Od 3,7 roku i w praktyce także w 3,6 - wtedy wprowadzono nowe zachowanie, ale nie uwzględniono go w specyfikacji języka do 3.7 - iteracja po klawiszach, wartościach lub elementach dyktatu (i, jak sądzę, set also) zwróci najpierw najmniej niedawno wstawione obiekty. Nadal nie ma prostego sposobu, aby uzyskać do nich dostęp za pomocą numerycznego indeksu wstawiania.
Jeśli chodzi o kwestię wybierania i „formatowania” elementów, jeśli znasz klucz, który chcesz pobrać ze słownika, normalnie użyłbyś klucza jako indeksu dolnego, aby go pobrać ( my_var = mydict['Apple']
).
Jeśli naprawdę chcesz mieć możliwość indeksowania pozycji według numeru pozycji (ignorując fakt, że numer konkretnego wpisu będzie się zmieniał w miarę wstawiania), wówczas odpowiednią strukturą byłaby prawdopodobnie lista dwuelementowych krotek. Zamiast
mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }
możesz użyć:
mylist = [
('Apple', {'American':'16', 'Mexican':10, 'Chinese':5}),
('Grapes', {'Arabian': '25', 'Indian': '20'}
]
W tym systemie pierwszy wpis jest mylist[0]
w klasycznej postaci zakończonej listą, a jego wartość to ('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})
. Możesz iterować całą listę w następujący sposób:
for (key, value) in mylist: # unpacks to avoid tuple indexing
if key == 'Apple':
if 'American' in value:
print(value['American'])
ale jeśli wiesz, że szukasz klucza „Apple”, dlaczego nie miałbyś zamiast tego po prostu użyć dyktowania?
Możesz wprowadzić dodatkowy poziom pośrednictwa, buforując listę kluczy, ale złożoność utrzymywania synchronizacji dwóch struktur danych nieuchronnie zwiększyłaby złożoność twojego kodu.