Come si trova la prima chiave in un dizionario?


200

Sto cercando di far stampare il mio programma "banana"dal dizionario. Quale sarebbe il modo più semplice per farlo?

Questo è il mio dizionario:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}

35
I dizionari in Python non sono ordinati, quindi non esiste una "prima chiave". Vedi qui
David Robinson,

2
Vuoi stampare letteralmente la parola "banana" o il valore associato a "banana" (4, in questo caso)?
Paul H,

to print out banana with a FOR loop, so when I run it, each key would also be printed outIntendi for k in prices: print k? Questo stamperà tutte le chiavi del dizionario.
David Robinson,


7
per il primo commento: in Python 3.6 e versioni successive dictionariesare ordinato (vedi stackoverflow.com/questions/39980323/... )
Egirus Ornila

Risposte:


284

Su una versione di Python in cui sono effettivamente ordinati i dadi, puoi farlo

my_dict = {'foo': 'bar', 'spam': 'eggs'}
next(iter(my_dict)) # outputs 'foo'

Per ordinare i dicts, hai bisogno di Python 3.7+ o 3.6+ se stai bene affidandoti alla natura ordinata di dettagli tecnici e di implementazione dei dicts su Python 3.6.

Per le versioni precedenti di Python, non esiste una "prima chiave".


29
Se vuoi sia la chiave che il valore in Python 3:next(iter( my_dict.items() ))
Jonathan H

I dicts di Python di @RyanHaining sono ordinati per inserimento a partire da CPython 3.6 e qualsiasi altra implementazione di Python a partire da Python 3.7
Boris

1
questa risposta ha rovinato la mia sessione di debug che ho aspettato 6 ore per arrivare al punto di interruzione. Questo è molto fastidioso.
Michael,

128

Un dizionario non è indicizzato, ma è in qualche modo ordinato. Di seguito ti darebbe la prima chiave esistente:

list(my_dict.keys())[0]

25
Non sarebbe più semplice metterlo list(my_dict)[0]dal momento che recupererà comunque l'elenco delle chiavi?
Jean-Francois T.

@ Jean-franchista. si
Ryan Haining,

I dizionari sono ora ordinati in CPython 3.6 e tutte le altre implementazioni di Python che iniziano con Python 3.7
Boris,

53

Aggiornamento: a partire da Python 3.7, l'ordine di inserimento viene mantenuto, quindi non è necessario un OrderedDictqui. È possibile utilizzare gli approcci di seguito con un normaledict

Modificato nella versione 3.7: l' ordine del dizionario è garantito come ordine di inserimento. Questo comportamento era un dettaglio di implementazione di CPython da 3.6.

fonte


Python 3.6 e precedenti *

Se stai parlando di un normale dict, allora la "prima chiave" non significa nulla. Le chiavi non sono ordinate in alcun modo su cui poter contare. Se esegui iterazioni su di dictte probabilmente non otterrai "banana"la prima cosa che vedi.

Se devi mantenere le cose in ordine, devi usare un OrderedDictdizionario e non solo un semplice dizionario.

import collections
prices  = collections.OrderedDict([
        ("banana", 4),
        ("apple", 2),
        ("orange", 1.5),
        ("pear", 3),
])

Se poi volevi vedere tutte le chiavi in ordine, puoi farlo scorrendo attraverso di essa

for k in prices:
    print(k)

In alternativa, potresti mettere tutte le chiavi in ​​un elenco e quindi lavorare con quello

ks = list(prices)
print(ks[0]) # will print "banana"

Un modo più veloce per ottenere il primo elemento senza creare un elenco sarebbe quello di chiamare nextl'iteratore. Questo non si generalizza bene quando si cerca di ottenere l' nthelemento

>>> next(iter(prices))
'banana'

* CPython aveva garantito l'ordine di inserimento come dettaglio di implementazione in 3.6.


Grazie per il consiglio. Mi dispiace per non essere più chiaro. Sto solo cercando di trovare il codice che mi permetterà di stampare "Banana" NON il valore ad esso associato. Grazie per tutti gli input!
slago

31

Per Python 3 di seguito elimina il sovraccarico della conversione dell'elenco:

first = next(iter(prices.values()))

10

Il dicttipo è una mappatura non ordinata , quindi non esiste un "primo" elemento.

Quello che vuoi è probabilmente collections.OrderedDict.


o una coppia nominata forse se è immutabile
Joran Beasley

Questo è cambiato da Python 3.6. I dizionari sono ora ordinati.
misantroop,

1
Beh, tecnicamente, vuoi il primo elemento delle chiavi del dizionario se sei sicuro, c'è solo una chiave.
DBX12,

si potrebbe dire il primo elemento mentre si scorre su un dict che è stato risolto. Ma buona fortuna a capirlo.
demongolem il

6

Così ho trovato questa pagina mentre cercavo di ottimizzare qualcosa per prendere l'unica chiave in un dizionario di lunghezza nota 1 e restituire solo la chiave. Il processo di seguito è stato il più veloce per tutti i dizionari che ho provato fino alla dimensione 700.

Ho provato 7 approcci diversi e ho scoperto che questo era il migliore, sul mio Macbook 2014 con Python 3.6:

def first_5():
    for key in biased_dict:
        return key

I risultati della loro profilazione sono stati:

  2226460 / s with first_1
  1905620 / s with first_2
  1994654 / s with first_3
  1777946 / s with first_4
  3681252 / s with first_5
  2829067 / s with first_6
  2600622 / s with first_7

Tutti gli approcci che ho provato sono qui:

def first_1():
    return next(iter(biased_dict))


def first_2():
    return list(biased_dict)[0]


def first_3():
    return next(iter(biased_dict.keys()))


def first_4():
    return list(biased_dict.keys())[0]


def first_5():
    for key in biased_dict:
        return key


def first_6():
    for key in biased_dict.keys():
        return key


def first_7():
    for key, v in biased_dict.items():
        return key

1
Quindi fare un ciclo for e restituire la prima chiave (first_5) è in realtà il più veloce che posso vedere? Anche un bel confronto tra i diversi approcci.
PiMathCLanguage,

1
sì, e non solo il più veloce, ma il più veloce di un miglio di campagna. Anche il più facile da leggere, comodamente.
turiyag,

4

Per quanto semplice, la risposta secondo me sarà

first = list(prices)[0]

la conversione del dizionario in elenco genererà le chiavi e selezioneremo la prima chiave dall'elenco.


Per python3, non è necessario creare un elenco completamente nuovo per recuperare solo il suo primo elemento. Migliore utilizzo next(iter(prices)), come già suggerito da altre risposte.
Normanius

1

Come molti altri hanno sottolineato, non esiste un primo valore in un dizionario. L'ordinamento in essi è arbitrario e non puoi contare sul fatto che l'ordinamento sia lo stesso ogni volta che accedi al dizionario. Tuttavia, se si desidera stampare le chiavi in ​​un paio di modi:

for key, value in prices.items():
    print(key)

Questo metodo utilizza l'assegnazione tupla per accedere alla chiave e al valore. Questo è utile se è necessario accedere sia alla chiave che al valore per qualche motivo.

for key in prices.keys():
    print(key)

Questo darà accesso alle chiavi solo come keys()suggerisce il metodo.


1

d.keys () [0] per ottenere la chiave individuale.

Aggiornamento: - @AlejoBernardin, non sono sicuro del motivo per cui hai detto che non funzionava. qui ho controllato e ha funzionato. importare raccolte

prices  = collections.OrderedDict((

    ("banana", 4),
    ("apple", 2),
    ("orange", 1.5),
    ("pear", 3),
))
prices.keys()[0]

'Banana'


In base al numero di voti, perché questa non è la migliore soluzione migliore?
GuSuku,

18
Funziona in python2 ma non in python3. In python3, dict.keys()restituisce a 'dict_keys' objectanziché a list, che non supporta l'indicizzazione.
Mavix

TypeError: l'oggetto 'dict_keys' non supporta l'indicizzazione
anilbey

0

Utilizzare un ciclo for che spazia tra tutte le chiavi in prices:

for key, value in prices.items():
     print key
     print "price: %s" %value

Assicurati di passare prices.items()a prices.iteritems()se stai usando Python 2.x.


0

Se vuoi solo la prima chiave di un dizionario, dovresti usare ciò che molti hanno suggerito prima

first = next(iter(prices))

Tuttavia, se si desidera il primo e mantenere il resto come elenco, è possibile utilizzare l'operatore di decompressione dei valori

first, *rest = prices

Lo stesso vale per i valori sostituendo pricescon prices.values()e sia per la chiave che per il valore è anche possibile utilizzare l'assegnazione di decompressione

>>> (product, price), *rest = prices.items()
>>> product
'banana'
>>> price
4

Nota: potresti essere tentato di usare first, *_ = pricessolo per ottenere la prima chiave, ma in genere sconsiglioi questo utilizzo a meno che il dizionario non sia molto breve poiché scorre su tutte le chiavi e la creazione di un elenco per l' restoverhead ha qualche sovraccarico.

Nota: come menzionato da altri, l'ordine di inserzione è preservato da Python 3.7 (o tecnicamente 3.6) e versioni successive, mentre le implementazioni precedenti devono essere considerate come un ordine indefinito.


-3

il modo più semplice è:

first_key = my_dict.keys()[0]

ma a volte dovresti stare più attento e assicurarti che la tua entità sia un prezioso elenco quindi:

first_key = list(my_dict.keys())[0]

3
Solleva TypeError: 'dict_keys' object is not subscriptable, almeno con Python 3.8
Eerik Sven Puudist il
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.