Hice una función que buscará edades en a Dictionary
y mostrará el nombre correspondiente:
dictionary = {'george' : 16, 'amber' : 19}
search_age = raw_input("Provide age")
for age in dictionary.values():
if age == search_age:
name = dictionary[age]
print name
Sé cómo comparar y encontrar la edad, pero no sé cómo mostrar el nombre de la persona. Además, recibo una respuesta a KeyError
causa de la línea 5. Sé que no es correcta, pero no puedo encontrar la manera de hacer que busque hacia atrás.
python
dictionary
user998316
fuente
fuente
Respuestas:
No hay ninguno.
dict
no está destinado a ser utilizado de esta manera.fuente
Python 3.x
list.items()
lugar delist.iteritems()
debería usarsedict
puede ser para varias cosas en diferentes momentos; las claves y los valores tienen un significado claro, por supuesto, pero "dict
elementos con un valor dado" es una solicitud perfectamente razonable. La recomendación de usar una lista de pares descartaría el contexto de que un elemento es una ' definición ' del otro, por ejemplo, en listas de parámetros ...O en Python 3.x:
Básicamente, separa los valores del diccionario en una lista, encuentra la posición del valor que tiene y obtiene la clave en esa posición.
Más sobre
keys()
y.values()
en Python 3: ¿Cómo puedo obtener la lista de los valores de dict?fuente
list.keys()
ylist.values()
funciones generan artículos en mismo orden?index
método.Si quieres tanto el nombre como la edad, deberías estar usando lo
.items()
que te da(key, value)
tuplas clave :Puede descomprimir la tupla en dos variables separadas directamente en el
for
bucle, luego hacer coincidir la edad.También debe considerar invertir el diccionario si generalmente va a buscar por edad, y no hay dos personas que tengan la misma edad:
para que puedas buscar el nombre de una edad simplemente haciendo
Lo he estado llamando en
mydict
lugar delist
porquelist
es el nombre de un tipo incorporado, y no deberías usar ese nombre para nada más.Incluso puede obtener una lista de todas las personas con una edad determinada en una línea:
o si solo hay una persona con cada edad:
que solo te dará
None
si no hay nadie con esa edad.Finalmente, si
dict
es largo y está en Python 2, debería considerar usarlo en.iteritems()
lugar de.items()
como lo hizo Cat Plus Plus en su respuesta, ya que no necesita hacer una copia de la lista.fuente
dict
con una lista de pares.dict
tiene sentido.value --> key
okey --> value
Pensé que sería interesante señalar qué métodos son los más rápidos y en qué escenario:
Aquí hay algunas pruebas que ejecuté (en una MacBook Pro 2012)
Resultados de
profile.run()
cada método 100000 veces:Método 1:
Método 2:
Método 3:
Esto muestra que, para un dict pequeño, el método 1 es el más rápido. Esto es muy probable porque devuelve la primera coincidencia, a diferencia de todas las coincidencias como el método 2 (ver nota a continuación).
Curiosamente, al realizar las mismas pruebas en un dict que tengo con 2700 entradas, obtengo resultados bastante diferentes (esta vez ejecutados 10000 veces):
Método 1:
Método 2:
Método 3:
Aquí, el método 3 es mucho más rápido. Solo muestra que el tamaño de su dict afectará el método que elija.
Notas: El método 2 devuelve una lista de todos los nombres, mientras que los métodos 1 y 3 solo devuelven la primera coincidencia. No he considerado el uso de memoria. No estoy seguro de si el método 3 crea 2 listas adicionales (claves () y valores ()) y las almacena en la memoria.
fuente
.keys()
vistas de.values()
retorno del diccionario, que son livianas.versión de una línea: (i es un diccionario antiguo, p es un diccionario inverso)
explicación:
i.keys()
yi.values()
devuelve dos listas con claves y valores del diccionario respectivamente. La función zip tiene la capacidad de unir listas para producir un diccionario.Advertencia: Esto funcionará solo si los valores son hashables y únicos.
fuente
o mejor
fuente
fuente
lKey = [k for k, v in lDictionary.iteritems() if v == lValue][0] or 'else-key'
Pruebe esta línea para invertir un diccionario:
fuente
Encontré esta respuesta muy efectiva pero no muy fácil de leer para mí.
Para que quede más claro, puede invertir la clave y el valor de un diccionario. Esto es hacer que las claves sean valores y claves de valores, como se ve aquí .
o
que es esencialmente lo mismo que esta otra respuesta .
fuente
Si desea encontrar la clave por el valor, puede usar una comprensión del diccionario para crear un diccionario de búsqueda y luego usarlo para encontrar la clave del valor.
fuente
Puede obtener la clave mediante el uso de
dict.keys()
,dict.values()
ylist.index()
métodos, ver ejemplos de código a continuación:fuente
search_age
var definido en la siguiente línea ... ¿Tal vez deberías reemplazarvalue
consearch_age
?type(dict_values)
sería útil imprimir )?Aquí está mi opinión sobre este problema. :) Acabo de empezar a aprender Python, así que llamo a esto:
Solución "La comprensible para principiantes".
.
.
fuente
fuente
is
se debe utilizar solamente para las pruebas de igualdad de los hijos únicos (None
,True
,False
etc.). El hecho de que CPython reutilice literales de cadena (y, pora = 'foobar'; a is 'foobar'
lo tanto, lo esTrue
) es un detalle de implementación y no se debe confiar en él.get_key
arrojaráStopIteration
si el valor no existe en el diccionario; sería mejor usarnext(..., None)
cuál devolveríaNone
si no se encuentra el valor.get_first_key = lambda v, d: next((k for k in d if (v in d[k] is not None)), None)
Considera usar pandas. Como se indica en "Python for Data Analysis" de William McKinney
Para consultar su serie, haga lo siguiente:
Cuyos rendimientos:
Si necesita hacer algo más con la salida, puede ser útil transformar la respuesta en una lista:
fuente
Aquí, recovery_key toma el diccionario y el valor para buscar en el diccionario. Luego recorremos las teclas en el diccionario y hacemos una comparación con la de valor y devolvemos esa clave en particular.
fuente
podemos obtener el
Key
dedict
:fuente
fuente
es respondido, pero podría hacerse con un uso elegante de 'mapa / reducir', por ejemplo:
fuente
Cat Plus Plus mencionó que no es así como se pretende utilizar un diccionario. Este es el por qué:
La definición de un diccionario es análoga a la de un mapeo en matemáticas. En este caso, un dict es un mapeo de K (el conjunto de claves) a V (los valores), pero no al revés. Si cancela la referencia a un dict, espera obtener exactamente un valor devuelto. Pero, es perfectamente legal que diferentes claves se asignen al mismo valor, por ejemplo:
Cuando busca una clave por su valor correspondiente, esencialmente está invirtiendo el diccionario. ¡Pero un mapeo no es necesariamente invertible! En este ejemplo, pedir la clave correspondiente a v1 podría generar k1 o k3. ¿Deberías devolver ambos? ¿Solo el primero encontrado? Es por eso que indexof () no está definido para los diccionarios.
Si conoce sus datos, podría hacer esto. Pero una API no puede suponer que un diccionario arbitrario es invertible, de ahí la falta de dicha operación.
fuente
Aquí está mi opinión al respecto. Esto es bueno para mostrar múltiples resultados en caso de que necesite uno. Así que también agregué la lista
Y eso es...
fuente
El resultado es el siguiente:
fuente
No hay una manera fácil de encontrar una clave en una lista 'buscando' el valor. Sin embargo, si conoce el valor, iterando a través de las claves, puede buscar valores en el diccionario por elemento. Si D [elemento] donde D es un objeto de diccionario, es igual a la clave que está intentando buscar, puede ejecutar algún código.
fuente
Necesita usar un diccionario y el reverso de ese diccionario. Significa que necesita otra estructura de datos. Si está en Python 3, use el
enum
módulo, pero si está usando Python 2.7, useenum34
el puerto de vuelta para Python 2.Ejemplo:
fuente
fuente
Solo mi respuesta en
lambda
yfilter
.fuente
ya se ha respondido, pero dado que varias personas mencionaron invertir el diccionario, así es como lo hace en una línea (suponiendo un mapeo 1: 1) y algunos datos de rendimiento diferentes:
Python 2.6:
2.7+:
Si cree que no es 1: 1, aún puede crear una asignación inversa razonable con un par de líneas:
qué tan lento es esto: más lento que una simple búsqueda, pero no tan lento como se podría pensar: en un diccionario de entrada 100000 "directo", una búsqueda "rápida" (es decir, buscar un valor que debería estar al principio de las teclas) fue aproximadamente 10 veces más rápido que invertir todo el diccionario, y una búsqueda 'lenta' (hacia el final) aproximadamente 4-5 veces más rápido. Entonces, después de un máximo de 10 búsquedas, se paga solo.
la segunda versión (con listas por elemento) tarda aproximadamente 2.5 veces más que la versión simple.
También tuvo algunos resultados interesantes con ifilter. Teóricamente, ifilter debería ser más rápido, ya que podemos usar itervalues () y posiblemente no tener que crear / revisar la lista completa de valores. En la práctica, los resultados fueron ... extraños ...
Entonces, para pequeñas compensaciones, fue dramáticamente más rápido que cualquier versión anterior (2.36 * u * S vs. un mínimo de 1.48 * m * S para casos anteriores). Sin embargo, para grandes compensaciones cerca del final de la lista, fue drásticamente más lento (15,1 ms frente a los mismos 1,48 ms). Los pequeños ahorros en el extremo inferior no valen el costo en el extremo superior, en mi humilde opinión.
fuente
[
, si es así. de lo contrario, asegúrese de que esté en dos líneas, o ponga una;
entre ellas si no lo está.A veces puede ser necesario int ():
fuente
Aquí hay una solución que funciona tanto en Python 2 como en Python 3:
La parte hasta
[search_age]
construye el diccionario inverso (donde los valores son claves y viceversa). Podría crear un método auxiliar que almacenará en caché este diccionario invertido de la siguiente manera:o incluso más generalmente una fábrica que crearía un método de búsqueda de nombres por edad para una o más de sus listas
para que puedas hacer:
Tenga en cuenta que Retitulé
list
aages_by_name
ya que el primero es un tipo predefinido.fuente
Así es como accede al diccionario para hacer lo que quiere:
por supuesto, sus nombres están tan apagados que parece que se imprimiría una edad, pero SÍ imprime el nombre. Como está accediendo por nombre, se vuelve más comprensible si escribe:
Mejor todavía:
fuente
Para múltiples ocurrencias use:
fuente
*** NameError: global name 'dictionary' is not defined
filter( lambda x, dictionary=dictionary, search_age=int(search_age): dictionary[x] == search_age , dictionary )