¿Cómo encuentras la primera clave en un diccionario?

200

Estoy intentando que mi programa se imprima "banana"desde el diccionario. ¿Cuál sería la forma más sencilla de hacer esto?

Este es mi diccionario:

prices = {
    "banana" : 4,
    "apple" : 2,
    "orange" : 1.5,
    "pear" : 3
}
Slagoy
fuente
35
Los diccionarios en Python no están ordenados, por lo que no hay una "primera clave". Ver aquí
David Robinson,
2
¿Desea imprimir literalmente la palabra "banana" o el valor asociado con "banana" (4, en este caso)?
Paul H
to print out banana with a FOR loop, so when I run it, each key would also be printed outQué quiere decir for k in prices: print k? Eso imprimirá todas las claves en el diccionario.
David Robinson
77
al primer comentario: en python 3.6+ se ordenan diccionarios (ver stackoverflow.com/questions/39980323/… )
Egirus Ornila

Respuestas:

284

En una versión de Python donde se ordenan los dictados, puede hacer

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

Para que se ordenen los dictados, necesita Python 3.7+ o 3.6+ si está de acuerdo con confiar en la naturaleza ordenada técnicamente de detalles de implementación de los dictos en Python 3.6.

Para versiones anteriores de Python, no hay una "primera clave".

maxbellec
fuente
29
Si desea clave y valor en Python 3:next(iter( my_dict.items() ))
Jonathan H
Los dictados de @RyanHaining Python se ordenan por inserción comenzando con CPython 3.6 y cualquier otra implementación de Python que comience con Python 3.7
Boris
1
Esta respuesta arruinó mi sesión de depuración que esperé 6 horas para llegar al punto de interrupción. Esto es muy vexxing.
Michael
128

Un diccionario no está indexado, pero de alguna manera está ordenado. Lo siguiente le daría la primera clave existente:

list(my_dict.keys())[0]
ylnor
fuente
25
¿No sería más fácil simplemente ponerlo list(my_dict)[0]ya que recuperará la lista de claves de todos modos?
Jean-Francois T.
@ Jean-FrancoisT. sí
Ryan Haining
Los diccionarios ahora están ordenados en CPython 3.6 y todas las demás implementaciones de Python que comienzan con Python 3.7
Boris
53

Actualización: a partir de Python 3.7, se mantiene el orden de inserción, por lo que no necesita un OrderedDictaquí. Puede usar los siguientes enfoques con una normalidaddict

Modificado en la versión 3.7: el orden del diccionario está garantizado como orden de inserción. Este comportamiento fue un detalle de implementación de CPython desde 3.6.

fuente


Python 3.6 y anterior *

Si está hablando de un habitual dict, entonces la "primera clave" no significa nada. Las claves no están ordenadas de ninguna manera en la que pueda confiar. Si iteras sobre tu dictprobablemente no obtendrás "banana"lo primero que ves.

Si necesita mantener las cosas en orden, debe usar un OrderedDicty no solo un diccionario simple.

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

Si desea ver todas las claves en orden , puede hacerlo iterando a través de él

for k in prices:
    print(k)

Podría, alternativamente, poner todas las claves en una lista y luego trabajar con eso

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

Una forma más rápida de obtener el primer elemento sin crear una lista sería llamar nextal iterador. Sin embargo, esto no se generaliza bien cuando se intenta obtener el nthelemento

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

* CPython había garantizado el orden de inserción como detalle de implementación en 3.6.

Ryan Haining
fuente
Gracias por el consejo. Lo siento por no ser más claro. Solo estoy tratando de encontrar el código que me permita imprimir "Banana" NO el valor asociado con él. Gracias por toda la entrada!
Slagoy
31

Para Python 3 a continuación se elimina la sobrecarga de la conversión de la lista:

first = next(iter(prices.values()))
Shital Shah
fuente
10

El dicttipo es un desordenado mapeo , por lo que no existe un elemento "primero".

Lo que quieres es probablemente collections.OrderedDict.


fuente
o una tupla nombrada tal vez si es inmutable
Joran Beasley
Esto ha cambiado a partir de Python 3.6. Los diccionarios ahora están ordenados.
misantroop
1
Bueno, técnicamente, quieres el primer elemento de las claves del diccionario si estás seguro, solo hay una clave.
DBX12
uno podría decir el primer elemento mientras itera sobre un dict que está solucionado. Pero buena suerte resolviendo eso.
demongolem
6

Así que encontré esta página mientras intentaba optimizar algo para tomar la única clave en un diccionario de longitud conocida 1 y devolver solo la clave. El siguiente proceso fue el más rápido para todos los diccionarios que probé hasta el tamaño 700.

Probé 7 enfoques diferentes, y descubrí que este era el mejor, en mi Macbook 2014 con Python 3.6:

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

Los resultados de su perfil fueron:

  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

Todos los enfoques que probé están aquí:

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
turiyag
fuente
1
Entonces, ¿hacer un bucle for y devolver la primera clave (first_5) es realmente lo más rápido que puedo ver? También una buena comparación de los diferentes enfoques.
PiMathCLanguage
1
sí, y no solo el más rápido, sino el más rápido por una milla de campo. También el más fácil de leer, convenientemente.
turiyag
4

Bueno, así de simple, la respuesta según mí será

first = list(prices)[0]

la conversión del diccionario a la lista generará las claves y seleccionaremos la primera clave de la lista.

narwanimonish
fuente
Para python3, no es necesario crear una lista completamente nueva para recuperar solo su primer elemento. Mejor uso next(iter(prices)), como ya lo sugieren otras respuestas.
Normanius
1

Como muchos otros han señalado, no hay un primer valor en un diccionario. La clasificación en ellos es arbitraria y no puede contar con que la clasificación sea la misma cada vez que acceda al diccionario. Sin embargo, si desea imprimir las claves, hay un par de formas:

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

Este método utiliza la asignación de tuplas para acceder a la clave y al valor. Esto es útil si necesita acceder a la clave y al valor por algún motivo.

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

Esto solo dará acceso a las claves como lo keys()implica el método.

kylie.a
fuente
1

d.keys () [0] para obtener la clave individual.

Actualización: - @AlejoBernardin, no estoy seguro de por qué dijiste que no funcionó. Aquí lo comprobé y funcionó. importar colecciones

prices  = collections.OrderedDict((

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

'plátano'

Amit Sharma
fuente
A juzgar por el número de votos, ¿por qué esta no es la mejor solución?
GuSuku
18
Esto funciona en python2 pero no en python3. En python3, dict.keys()devuelve un en 'dict_keys' objectlugar de a list, que no admite la indexación.
mavix
TypeError: el objeto 'dict_keys' no admite indexación
anilbey
0

Use un bucle for que abarque todas las claves en prices:

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

Asegúrese de cambiar prices.items()a prices.iteritems()si está usando Python 2.x

Mark M
fuente
0

Si solo desea la primera clave de un diccionario, debe usar lo que muchos han sugerido antes

first = next(iter(prices))

Sin embargo, si desea el primero y mantener el resto como una lista, puede usar el operador de desempaquetado de valores

first, *rest = prices

Lo mismo se aplica a los valores reemplazando pricescon prices.values()y para la clave y el valor, incluso puede usar la asignación de desempaquetado

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

Nota: Es posible que tenga la tentación de usar first, *_ = pricessolo para obtener la primera clave, pero generalmente recomendaría este uso a menos que el diccionario sea muy corto, ya que recorre todas las claves y crea una lista para que resttenga algo de sobrecarga.

Nota: Como se mencionó por otros, el orden de inserción se conserva de Python 3.7 (o técnicamente 3.6) y anteriores, mientras que las implementaciones anteriores deben considerarse como un orden indefinido.

wihlke
fuente
-3

La forma más fácil es:

first_key = my_dict.keys()[0]

pero algunas veces debes ser más cuidadoso y asegurarte de que tu entidad sea una lista valiosa, así que:

first_key = list(my_dict.keys())[0]
nasim seifi
fuente
3
Sube TypeError: 'dict_keys' object is not subscriptable, al menos con Python 3.8
Eerik Sven Puudist