Rozważ taki dyktando
mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }
Jak mogę na przykład uzyskać dostęp do określonego elementu tego słownika? na przykład chciałbym wydrukować pierwszy element po pewnym sformatowaniu pierwszego elementu Apple, który w naszym przypadku jest tylko „amerykański”?
Informacje dodatkowe Powyższa struktura danych została utworzona poprzez analizę pliku wejściowego w funkcji Pythona. Po utworzeniu pozostaje jednak taki sam dla tego biegu.
Używam tej struktury danych w mojej funkcji.
Więc jeśli plik ulegnie zmianie, przy następnym uruchomieniu tej aplikacji zawartość pliku będzie inna, a zatem zawartość tej struktury danych będzie inna, ale format będzie taki sam. Więc widzisz, że w mojej funkcji nie wiem, czy pierwszy element w Apple jest „amerykański” lub cokolwiek innego, więc nie mogę bezpośrednio użyć klucza „amerykański”.
źródło
dict
. Słowo „dict” jest już słowem kluczowym w Pythonie. Użyj czegoś innego, na przykładmydict
.Odpowiedzi:
Biorąc pod uwagę, że jest to słownik, dostęp do niego uzyskuje się za pomocą klawiszy. Pobierając słownik przechowywany w „Apple”, wykonaj następujące czynności:
Aby dowiedzieć się, ilu z nich to Amerykanie (16), zrób tak:
źródło
.keys()
aby mieć do nich dostęp dynamicznie."n"
na nieznanej głębokości, przechowywany w nieznanym elemencie.Jeśli pytanie brzmi, jeśli wiem, że mam dyktando zawierające „Apple” jako owoc i „American” jako rodzaj jabłka, użyłbym:
jak sugerowali inni. Jeśli zamiast tego pojawia się pytanie, nie wiesz, czy `` Apple '' jako owoc i `` amerykański '' jako typ `` Apple '' istnieje, gdy wczytujesz dowolny plik do swojej struktury danych dyktowania, możesz zrobić coś takiego:
lub jeszcze lepiej, aby nie powtarzać niepotrzebnie całego dyktowania, jeśli wiesz, że tylko Apple ma typ amerykański:
We wszystkich tych przypadkach nie ma znaczenia, w jakiej kolejności słowniki faktycznie przechowują wpisy. Jeśli naprawdę martwisz się o zamówienie, możesz rozważyć użycie
OrderedDict
:http://docs.python.org/dev/library/collections.html#collections.OrderedDict
źródło
Jak zauważyłem twój opis, po prostu wiesz, że twój parser poda ci słownik, że jego wartości są również słownikiem:
Musisz więc iterować po swoim słowniku nadrzędnym. Jeśli chcesz wydrukować lub uzyskać dostęp do wszystkich pierwszych kluczy słownika na
sampleDict.values()
liście, możesz użyć czegoś takiego:Jeśli chcesz tylko uzyskać dostęp do pierwszego klucza pierwszej pozycji w
sampleDict.values()
, może to być przydatne:Jeśli użyjesz przykładu, który podałeś w pytaniu, mam na myśli:
Dane wyjściowe dla pierwszego kodu to:
Wynik dla drugiego kodu to:
źródło
Jako bonus chciałbym zaproponować inne rozwiązanie problemu. Wydaje się, że masz do czynienia ze słownikami zagnieżdżonymi, co jest zwykle uciążliwe, zwłaszcza gdy musisz sprawdzić, czy istnieje klucz wewnętrzny.
Istnieje kilka interesujących bibliotek dotyczących tego na pypi, oto szybkie wyszukiwanie .
W twoim konkretnym przypadku dict_digger wydaje się odpowiedni.
źródło
Możesz użyć,
dict['Apple'].keys()[0]
aby uzyskać pierwszy klucz zeApple
słownika, ale nie ma gwarancji, że tak będzieAmerican
. Kolejność kluczy w słowniku może się zmieniać w zależności od zawartości słownika i kolejności dodawania kluczy.źródło
OrderedDict
wcollections
biblioteceWiem, że to ma 8 lat, ale wygląda na to, że nikt nie przeczytał i nie odpowiedział na pytanie.
Możesz wywołać .values () na dykt, aby uzyskać listę wewnętrznych dykt i uzyskać do nich dostęp przez indeks.
źródło
'dict_values' object does not support indexing
. Zgadnij, że ta odpowiedź wymaga aktualizacji, ponieważ musisz zawinąć dict_values, aby odzyskać listęNie możesz polegać na porządku w słownikach. Ale możesz spróbować tego:
Jeśli chcesz, aby zamówienie zostało zachowane, możesz użyć tego: http://www.python.org/dev/peps/pep-0372/#ordered-dict-api
źródło
Prosty przykład, aby zrozumieć, jak uzyskać dostęp do elementów w słowniku: -
Utwórz słownik
Dowiedz się więcej o słownikach Pythona i ucz się interaktywnie tutaj ...
źródło
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, jakmydict[mydict.keys()[0]]
(tylko Python 2, ponieważ w Pythonie 3keys()
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
możesz użyć:
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: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.
źródło
Dzięki tej małej funkcji zagłębianie się w słownik w kształcie drzewa staje się dość łatwe:
Teraz
dig(mydict, "Apple.Mexican")
zwraca10
, podczas gdydig(mydict, "Grape")
daje poddrzewo{'Arabian':'25','Indian':'20'}
. Jeśli klucz nie jest zawarty w słowniku,dig
zwracaNone
.Zauważ, że możesz łatwo zmienić (lub nawet sparametryzować) znak separatora z „.” do „/”, „|” itp.
źródło