Come indicizzare in un dizionario?


97

Ho un dizionario qui sotto:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}

Come indicizzo la prima voce del dizionario?

colors[0]restituirà un KeyErrorper ovvi motivi.


4
Cosa significa "primo"? I dizionari non hanno ordini.
S.Lott

2
Dizionari è ora inserimento ordinato dal Python 3.7 Check this out: stackoverflow.com/questions/39980323/...
Nikita Alkhovik


1
@ S.Lott Scommetto che non avrebbe chiesto se sapeva che non erano ordinati :).
user7778287

Risposte:


113

I dizionari non sono ordinati nelle versioni di Python fino a Python 3.6 incluso. Se non ti interessa l'ordine delle voci e desideri comunque accedere alle chiavi o ai valori per indice, puoi utilizzare d.keys()[i]e d.values()[i]o d.items()[i]. (Nota che questi metodi creano un elenco di tutte le chiavi, i valori o gli elementi in Python 2.x. Quindi, se ne hai bisogno più di una volta, salva l'elenco in una variabile per migliorare le prestazioni.)

Se ti interessa l'ordine delle voci, a partire da Python 2.7 puoi usare collections.OrderedDict. Oppure usa un elenco di coppie

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]

se non è necessario l'accesso tramite chiave. (Perché i tuoi numeri sono stringhe a proposito?)

In Python 3.7, i dizionari normali sono ordinati, quindi non è più necessario utilizzarli OrderedDict(ma è ancora possibile - è fondamentalmente lo stesso tipo). L'implementazione CPython di Python 3.6 includeva già quella modifica, ma poiché non fa parte della specifica del linguaggio, non puoi fare affidamento su di essa in Python 3.6.


2
In Python 2, usa d.iterkeys().next()invece di d.keys()[0]per ispezionare una delle chiavi senza rimuoverla. Se il dizionario è enorme, farà una grande differenza in termini di prestazioni. Lo stesso vale per valori e articoli. In Python 2.7 puoi anche usare oggetti vista dict
simleo

44
In Python 3, queste chiamate restituiscono una vista, piuttosto che una lista reale, quindi dovresti racchiuderle in una chiamata a list () altrimenti vedrai: "TypeError: l'oggetto 'dict_values' non supporta l'indicizzazione". Vedere questa domanda SO: stackoverflow.com/questions/17431638/...
stifin

3
Solo un pelo di una correzione: non puoi indicizzare gli elementi (), almeno non in Python 3.
John Strong

1
Questa risposta è obsoleta per python 3.6+, vedere la risposta di @Pasha di seguito.
hans

1
@hans Questa risposta è obsoleta per Python 3.7, ma non per Python 3.6, poiché la natura di conservazione dell'ordine dei dizionari è un dettaglio dell'implementazione dell'implementazione CPython di quella versione Python, non una parte ufficiale del linguaggio. Aggiornerò questa risposta di conseguenza.
Sven Marnach

114

Se qualcuno sta ancora guardando questa domanda, la risposta attualmente accettata è ora obsoleta:

Dal momento che Python 3.7 * i dizionari preservano l'ordine , cioè ora si comportano esattamente come prima collections.OrderedDict. Sfortunatamente, non esiste ancora un metodo dedicato per indicizzare nel keys()/ values()del dizionario, quindi è possibile ottenere la prima chiave / valore nel dizionario come

first_key = list(colors)[0]
first_val = list(colors.values())[0]

o in alternativa (questo evita di istanziare la vista chiavi in ​​un elenco):

def get_first_key(dictionary):
    for key in dictionary:
        return key
    raise IndexError

first_key = get_first_key(colors)
first_val = colors[first_key]

Se hai bisogno di una nchiave -esima, allo stesso modo

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 includeva già i dict ordinati, ma questo era solo un dettaglio di implementazione. La specifica del linguaggio include i dict ordinati dalla 3.7 in poi.)


Potrebbe fornire il collegamento alla documentazione corrispondente?
Amir Afianian

3

Affrontare un elemento del dizionario è come sedersi su un asino e godersi il viaggio.

Come regola di Python DIZIONARIO è senza ordine

Se c'è

dic = {1: "a", 2: "aa", 3: "aaa"}

Ora supponiamo che se vado come dic[10] = "b", allora non aggiungerà sempre così

dic = {1:"a",2:"aa",3:"aaa",10:"b"}

Potrebbe essere come

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}

O

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}

O

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}

O qualsiasi combinazione del genere.

Quindi la regola del pollice è DIZIONARIO è senza ordine !


questo è molto diretto ... mi piace!
Alex Liu 33214


2

in realtà ho trovato una nuova soluzione che mi ha davvero aiutato, se sei particolarmente interessato all'indice di un certo valore in una lista o in un set di dati, puoi semplicemente impostare il valore del dizionario su quell'Indice !:

Sta 'a guardare:

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}

Ora, grazie alla potenza degli hashmap, puoi estrarre l'indice delle tue voci in tempo costante (ovvero molto più velocemente)


1

oh, è difficile. Quello che hai qui, fondamentalmente, sono due valori per ogni elemento. Quindi stai cercando di chiamarli con un numero come chiave. Sfortunatamente, uno dei tuoi valori è già impostato come chiave!

Prova questo:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

Ora puoi chiamare i tasti per numero come se fossero indicizzati come un elenco. Puoi anche fare riferimento al colore e al numero in base alla loro posizione all'interno dell'elenco.

Per esempio,

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

Naturalmente, dovrai trovare un altro modo per tenere traccia della posizione in cui si trova ciascun colore. Forse puoi avere un altro dizionario che memorizza la chiave di ogni colore come valore.

colors_key = {'blue': 1, 'red': 6, 'yllow': 8}

Quindi, sarai in grado di cercare anche la chiave dei colori, se necessario.

colors [colors_key ['blue']] [0] restituirà 'blue'

Qualcosa del genere.

E poi, già che ci sei, puoi creare un dict con i valori numerici come chiavi in ​​modo da poterli sempre usare per cercare i tuoi colori, sai, se ne hai bisogno.

valori = {5: [1, 'blue'], 6: [2, 'red'], 8: [3, 'yellow']}

Quindi, (colors [colors_key [values ​​[5] [1]]] [0]) restituirà 'blue'.

Oppure potresti usare un elenco di elenchi.

In bocca al lupo!


0

Non puoi, poiché dictnon è ordinato. puoi usare .popitem()per ottenere un elemento arbitrario, ma questo lo rimuoverà dal dict.


next(iter(d.items()))( .iteritems()in Python 2) fornisce anche un elemento arbitrario (lo stesso nei miei test, il che ha senso poiché popitem può essere implementato usando questo) ma non rimuoverà l'elemento.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.