Mam słownik poniżej:
colors = {
"blue" : "5",
"red" : "6",
"yellow" : "8",
}
Jak zindeksować pierwszy wpis w słowniku?
colors[0]
zwróci z KeyError
oczywistych powodów.
Mam słownik poniżej:
colors = {
"blue" : "5",
"red" : "6",
"yellow" : "8",
}
Jak zindeksować pierwszy wpis w słowniku?
colors[0]
zwróci z KeyError
oczywistych powodów.
Odpowiedzi:
Słowniki są nieuporządkowane w wersjach Pythona do Pythona 3.6 włącznie. Jeśli nie zależy Ci na kolejności wpisów i mimo wszystko chcesz uzyskać dostęp do kluczy lub wartości według indeksu, możesz użyć d.keys()[i]
i d.values()[i]
lub d.items()[i]
. (Zwróć uwagę, że te metody tworzą listę wszystkich kluczy, wartości lub elementów w Pythonie 2.x. Jeśli więc potrzebujesz ich więcej niż raz, przechowuj listę w zmiennej, aby poprawić wydajność).
Jeśli zależy Ci na kolejności wpisów, zaczynając od Pythona 2.7 możesz użyć collections.OrderedDict
. Lub użyj listy par
l = [("blue", "5"), ("red", "6"), ("yellow", "8")]
jeśli nie potrzebujesz dostępu za pomocą klucza. (Nawiasem mówiąc, dlaczego twoje ciągi liczbowe?)
W Pythonie 3.7 normalne słowniki są uporządkowane, więc nie musisz ich OrderedDict
już używać (ale nadal możesz - to w zasadzie ten sam typ). Implementacja CPythona w Pythonie 3.6 już zawierała tę zmianę, ale ponieważ nie jest to część specyfikacji języka, nie można na niej polegać w Pythonie 3.6.
d.iterkeys().next()
zamiast, d.keys()[0]
aby sprawdzić jeden z kluczy bez usuwania go. Jeśli słownik jest ogromny, będzie miał duży wpływ na wydajność. To samo dotyczy wartości i przedmiotów. W Pythonie 2.7 możesz także używać obiektów widoku dict
Jeśli ktoś nadal patrzy na to pytanie, obecnie przyjęta odpowiedź jest już nieaktualna:
Od wersji Python 3.7 * słowniki zachowują kolejność , to znaczy, że teraz zachowują się dokładnie tak, jak collections.OrderedDict
kiedyś. Niestety, nadal nie ma dedykowanej metody indeksowania do keys()
/ values()
ze słownika, więc pobranie pierwszego klucza / wartości w słowniku można wykonać w następujący sposób
first_key = list(colors)[0]
first_val = list(colors.values())[0]
lub alternatywnie (pozwala to uniknąć tworzenia instancji widoku kluczy w liście):
def get_first_key(dictionary):
for key in dictionary:
return key
raise IndexError
first_key = get_first_key(colors)
first_val = colors[first_key]
Jeśli potrzebujesz n
-tego klucza, to podobnie
def get_nth_key(dictionary, n=0):
if n < 0:
n += len(dictionary)
for i, key in enumerate(dictionary.keys()):
if i == n:
return key
raise IndexError("dictionary index out of range")
(* CPython 3.6 już zawierał dykty zamówione, ale był to tylko szczegół implementacji. Specyfikacja języka obejmuje dykty zamówione od wersji 3.7).
Zajmowanie się elementem słownika jest jak siedzenie na osiołku i radość z jazdy.
Z reguły w Pythonie SŁOWNIK jest uporządkowany
Jeśli jest
dic = {1: "a", 2: "aa", 3: "aaa"}
Teraz przypuśćmy, że jeśli pójdę tak dic[10] = "b"
, to nie będzie tak dodawać zawsze
dic = {1:"a",2:"aa",3:"aaa",10:"b"}
Może tak
dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}
Lub
dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}
Lub
dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}
Albo jakąkolwiek taką kombinację.
Zatem praktyczna zasada jest taka, że SŁOWNIK nie ma porządku !
Jeśli potrzebujesz uporządkowanego słownika, możesz użyć odict .
w rzeczywistości znalazłem nowatorskie rozwiązanie, które naprawdę mi pomogło.Jeśli jesteś szczególnie zainteresowany indeksem określonej wartości na liście lub zestawie danych, możesz po prostu ustawić wartość słownika na ten indeks !:
Tylko patrz:
list = ['a', 'b', 'c']
dictionary = {}
counter = 0
for i in list:
dictionary[i] = counter
counter += 1
print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2}
Teraz dzięki mocy hashmap możesz ciągnąć indeks swoich wpisów w stałym czasie (czyli o wiele szybciej)
och, to jest trudne. Zasadniczo masz tutaj dwie wartości dla każdego elementu. Następnie próbujesz zadzwonić do nich, podając numer jako klucz. Niestety, jedna z Twoich wartości jest już ustawiona jako klucz!
Spróbuj tego:
colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}
Teraz możesz wywoływać klucze według numerów, tak jakby były indeksowane jak lista. Możesz również odwołać się do koloru i numeru, podając ich pozycję na liście.
Na przykład,
colors[1][0]
// returns 'blue'
colors[3][1]
// returns '8'
Oczywiście będziesz musiał wymyślić inny sposób śledzenia lokalizacji każdego koloru. Może możesz mieć inny słownik, który przechowuje klucz każdego koloru jako jego wartość.
colors_key = {'blue': 1, 'red': 6, 'yllow': 8}
Wtedy będziesz mógł również sprawdzić klucz kolorów, jeśli zajdzie taka potrzeba.
colors [colors_key ['blue']] [0] zwróci wartość 'blue'
Coś w tym stylu.
A potem, kiedy już to robisz, możesz stworzyć dyktando z wartościami liczbowymi jako kluczami, aby zawsze móc ich użyć do wyszukania swoich kolorów, wiesz, jeśli potrzebujesz.
wartości = {5: [1, 'niebieski'], 6: [2, 'czerwony'], 8: [3, 'żółty']}
Następnie (colors [colors_key [values [5] [1]]] [0]) zwróci wartość „blue”.
Lub możesz użyć listy list.
Powodzenia!
Nie możesz, ponieważ dict
jest nieuporządkowany. możesz użyć, .popitem()
aby uzyskać dowolny przedmiot, ale spowoduje to usunięcie go z dyktowania.