Tengo un diccionario a continuación:
colors = {
"blue" : "5",
"red" : "6",
"yellow" : "8",
}
¿Cómo indexo la primera entrada del diccionario?
colors[0]
devolverá un KeyError
por razones obvias.
python
dictionary
indexing
Harpal
fuente
fuente
Respuestas:
Los diccionarios están desordenados en las versiones de Python hasta Python 3.6 inclusive. Si no le importa el orden de las entradas y desea tener acceso a las claves o valores de índice de todos modos, puede utilizar
d.keys()[i]
yd.values()[i]
od.items()[i]
. (Tenga en cuenta que estos métodos crean una lista de todas las claves, valores o elementos en Python 2.x. Por lo tanto, si los necesita más de una vez, almacene la lista en una variable para mejorar el rendimiento).Si le importa el orden de las entradas, puede comenzar con Python 2.7
collections.OrderedDict
. O usa una lista de paresl = [("blue", "5"), ("red", "6"), ("yellow", "8")]
si no necesita acceso por clave. (Por cierto, ¿por qué sus números son cadenas?)
En Python 3.7, los diccionarios normales están ordenados, por lo que ya no necesita usarlos
OrderedDict
(pero aún puede hacerlo, es básicamente del mismo tipo). La implementación CPython de Python 3.6 ya incluyó ese cambio, pero como no es parte de la especificación del lenguaje, no puede confiar en él en Python 3.6.fuente
d.iterkeys().next()
lugar ded.keys()[0]
para inspeccionar una de las claves sin quitarla. Si el diccionario es enorme, hará una gran diferencia en términos de rendimiento. Lo mismo ocurre con los valores y los artículos. En Python 2.7 también puede usar objetos de vista dictSi alguien todavía está mirando esta pregunta, la respuesta actualmente aceptada ahora está desactualizada:
Desde Python 3.7 *, los diccionarios mantienen el orden , es decir, ahora se comportan exactamente como
collections.OrderedDict
solían hacerlo. Desafortunadamente, todavía no existe un método dedicado para indexar enkeys()
/values()
del diccionario, por lo que obtener la primera clave / valor en el diccionario se puede hacer comofirst_key = list(colors)[0] first_val = list(colors.values())[0]
o alternativamente (esto evita instanciar la vista de claves en una lista):
def get_first_key(dictionary): for key in dictionary: return key raise IndexError first_key = get_first_key(colors) first_val = colors[first_key]
Si necesita una
n
-th clave, entonces de manera similardef 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 ya incluía dictados ordenados, pero esto era solo un detalle de implementación. La especificación del lenguaje incluye dictados ordenados desde 3.7 en adelante).
fuente
Abordar un elemento del diccionario es como sentarse en un burro y disfrutar del paseo.
Como regla de Python, el DICCIONARIO no tiene orden
Si hay
dic = {1: "a", 2: "aa", 3: "aaa"}
Ahora suponga que si voy como
dic[10] = "b"
, entonces no se agregará así siempredic = {1:"a",2:"aa",3:"aaa",10:"b"}
Puede ser como
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 cualquier combinación de ese tipo.
Así que la regla general es DICCIONARIO es inodora !
fuente
Si necesita un diccionario ordenado, puede usar odict .
fuente
De hecho, encontré una solución novedosa que realmente me ayudó. Si está especialmente preocupado con el índice de un cierto valor en una lista o conjunto de datos, ¡puede simplemente establecer el valor del diccionario en ese Índice !:
Sólo mira:
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}
Ahora, a través del poder de los hashmaps, puede extraer el índice de sus entradas en tiempo constante (también conocido como mucho más rápido)
fuente
oh, eso es difícil. Lo que tienes aquí, básicamente, son dos valores para cada elemento. Entonces estás intentando llamarlos con un número como clave. Desafortunadamente, uno de sus valores ya está establecido como clave.
Prueba esto:
colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}
Ahora puede llamar a las teclas por número como si estuvieran indexadas como una lista. También puede hacer referencia al color y el número por su posición dentro de la lista.
Por ejemplo,
colors[1][0] // returns 'blue' colors[3][1] // returns '8'
Por supuesto, tendrá que encontrar otra forma de realizar un seguimiento de la ubicación en la que se encuentra cada color. Tal vez pueda tener otro diccionario que almacene la clave de cada color como su valor.
Luego, también podrá buscar la clave de colores si es necesario.
colors [colors_key ['blue']] [0] devolverá 'blue'
Algo como eso.
Y luego, mientras lo hace, puede hacer un diccionario con los valores numéricos como claves para que siempre pueda usarlos para buscar sus colores, ya sabe, si es necesario.
Entonces, (colors [colors_key [valores [5] [1]]] [0]) devolverá 'azul'.
O puede utilizar una lista de listas.
¡Buena suerte!
fuente
No puedes, ya
dict
que no está ordenado. puede usar.popitem()
para obtener un elemento arbitrario, pero eso lo eliminará del dict.fuente
next(iter(d.items()))
(.iteritems()
en Python 2) también le da un elemento arbitrario (el mismo en mis pruebas, lo cual tiene sentido ya que popitem se puede implementar usando esto) pero no eliminará el elemento.