Considere un dictado como
mydict = {
'Apple': {'American':'16', 'Mexican':10, 'Chinese':5},
'Grapes':{'Arabian':'25','Indian':'20'} }
¿Cómo accedo, por ejemplo, a un elemento particular de este diccionario? por ejemplo, me gustaría imprimir el primer elemento después de formatear el primer elemento de Apple, que en nuestro caso es solo "americano".
Información adicional La estructura de datos anterior se creó analizando un archivo de entrada en una función de Python. Sin embargo, una vez creado, sigue siendo el mismo para esa ejecución.
Estoy usando esta estructura de datos en mi función.
Entonces, si el archivo cambia, la próxima vez que se ejecute esta aplicación, el contenido del archivo será diferente y, por lo tanto, el contenido de esta estructura de datos será diferente pero el formato será el mismo. Así que, en mi función, no sé si el primer elemento en Apple es 'americano' o cualquier otra cosa, así que no puedo usar directamente 'americano' como clave.
fuente
dict
. La palabra 'dict' ya es una palabra clave en Python. Usa algo más, comomydict
.Respuestas:
Dado que se trata de un diccionario se accede a él mediante las teclas. Para obtener el diccionario almacenado en "Apple", haga lo siguiente:
Y para saber cuántos de ellos son estadounidenses (16), haga lo siguiente:
fuente
.keys()
para poder acceder a ellas de forma dinámica."n"
a una profundidad desconocida, almacenado en un elemento desconocido.Si la pregunta es, si sé que tengo un dictado de dictados que contiene 'Apple' como fruta y 'Americano' como un tipo de manzana, usaría:
como sugirieron otros. Si, en cambio, la pregunta es, no sabe si 'Apple' como fruta y 'American' como un tipo de 'Apple' existen cuando lee un archivo arbitrario en su estructura de datos dict of dict, podría hacer algo como:
o mejor aún, para que no repita innecesariamente todo el dictado de dictados si sabe que solo Apple tiene el tipo estadounidense:
En todos estos casos, no importa en qué orden los diccionarios almacenan realmente las entradas. Si está realmente preocupado por el pedido, podría considerar usar un
OrderedDict
:http://docs.python.org/dev/library/collections.html#collections.OrderedDict
fuente
Como noté su descripción, solo sabe que su analizador le dará un diccionario cuyos valores también son diccionario como este:
Entonces tienes que iterar sobre tu diccionario principal. Si desea imprimir o acceder a todas las primeras claves del diccionario en la
sampleDict.values()
lista, puede usar algo como esto:Si solo desea acceder a la primera clave del primer elemento
sampleDict.values()
, esto puede ser útil:Si usa el ejemplo que dio en la pregunta, quiero decir:
La salida del primer código es:
Y la salida para el segundo código es:
fuente
Como beneficio adicional, me gustaría ofrecer una solución diferente a su problema. Parece estar tratando con diccionarios anidados, lo que suele ser tedioso, especialmente cuando tiene que comprobar la existencia de una clave interna.
Hay algunas bibliotecas interesantes con respecto a esto en pypi, aquí hay una búsqueda rápida para usted.
En su caso específico, dict_digger parece adecuado.
fuente
Puede usar
dict['Apple'].keys()[0]
para obtener la primera clave en elApple
diccionario, pero no hay garantía de que lo seaAmerican
. El orden de las claves en un diccionario puede cambiar según el contenido del diccionario y el orden en que se agregaron las claves.fuente
OrderedDict
en lacollections
bibliotecaSé que esto tiene 8 años, pero nadie parece haber leído y respondido la pregunta.
Puede llamar .values () en un dictado para obtener una lista de los dictados internos y así acceder a ellos por índice.
fuente
'dict_values' object does not support indexing
. Supongo que esta respuesta necesita una actualización, ya que necesita ajustar dict_values para recuperar una listaNo puede confiar en el orden de los diccionarios. Pero puedes intentar esto:
Si desea que se conserve el orden, puede usar esto: http://www.python.org/dev/peps/pep-0372/#ordered-dict-api
fuente
Ejemplo simple para entender cómo acceder a elementos en el diccionario: -
Crear un diccionario
Explore más sobre los diccionarios de Python y aprenda interactivamente aquí ...
fuente
Pocas personas parecen, a pesar de las muchas respuestas a esta pregunta, haber señalado que los diccionarios son mapeos desordenados, por lo que (hasta la bendición del orden de inserción con Python 3.7) la idea de la "primera" entrada en un diccionario literalmente se hizo sin sentido. E incluso
OrderedDict
solo se puede acceder a un índice numérico utilizando uglinesses comomydict[mydict.keys()[0]]
(solo Python 2, ya que en Python 3keys()
es un iterador no subscriptable).Desde 3.7 en adelante y en la práctica también en 3.6 - el nuevo comportamiento se introdujo entonces, pero no se incluyó como parte de la especificación del lenguaje hasta 3.7 - iteración sobre las claves, valores o elementos de un dict (y, creo, un set also) producirá primero los objetos insertados menos recientemente. Todavía no existe una forma sencilla de acceder a ellos mediante el índice numérico de inserción.
En cuanto a la cuestión de seleccionar y "formatear" elementos, si conoce la clave que desea recuperar en el diccionario, normalmente usaría la clave como subíndice para recuperarla (
my_var = mydict['Apple']
).Si realmente desea poder indexar los elementos por número de entrada (ignorando el hecho de que el número de una entrada en particular cambiará a medida que se realizan las inserciones), entonces la estructura apropiada probablemente sería una lista de tuplas de dos elementos. En vez de
puedes usar:
Bajo este régimen, la primera entrada está
mylist[0]
en la forma clásica indexada por lista, y su valor es('Apple', {'American':'16', 'Mexican':10, 'Chinese':5})
. Puede iterar sobre toda la lista de la siguiente manera:pero si sabes que estás buscando la clave "Apple", ¿por qué no usarías un dict en su lugar?
Podría introducir un nivel adicional de direccionamiento indirecto almacenando en caché la lista de claves, pero la complejidad de mantener dos estructuras de datos sincronizadas inevitablemente se sumaría a la complejidad de su código.
fuente
Con la siguiente función pequeña, buscar en un diccionario en forma de árbol se vuelve bastante fácil:
Ahora,
dig(mydict, "Apple.Mexican")
devuelve10
, mientras quedig(mydict, "Grape")
produce el subárbol{'Arabian':'25','Indian':'20'}
. Si una clave no está contenida en el diccionario,dig
devuelveNone
.Tenga en cuenta que puede cambiar fácilmente (o incluso parametrizar) el carácter separador de '.' a '/', '|' etc.
fuente