Accede a un elemento arbitrario en un diccionario en Python

Si un mydict no está vacío, mydict a un elemento arbitrario como:

 mydict[mydict.keys()[0]] 

¿Hay alguna manera mejor de hacer esto?

En Python 3, de forma no destructiva e iterativa:

 next(iter(mydict.values())) 

En Python 2, de forma no destructiva e iterativa:

 mydict.itervalues().next() 

Si quieres que funcione tanto en Python 2 como en 3, puedes usar el paquete six :

 six.next(six.itervalues(mydict)) 

aunque en este punto es bastante críptico y prefiero su código.

Si quieres eliminar algún artículo, haz:

 key, value = mydict.popitem() 

Tenga en cuenta que “primero” no es un término apropiado aquí. Esto es “cualquier” artículo, porque dict no es un tipo ordenado.

Si solo necesita acceder a un elemento (siendo el primero por casualidad, ya que los dictados no garantizan el pedido), simplemente puede hacer esto en Python 2 :

 my_dict.keys()[0] -> key of "first" element my_dict.values()[0] -> value of "first" element my_dict.items()[0] -> (key, value) tuple of "first" element 

Tenga en cuenta que (según mi conocimiento) Python no garantiza que 2 llamadas sucesivas a cualquiera de estos métodos regresen a la lista con el mismo pedido. Esto no es compatible con Python3.

En python3, el camino:

 dict.keys() 

devolvemos un valor en type: dict_keys (), obtendremos un error cuando obtengamos el primer miembro de las claves de dict de esta manera:

 dict.keys()[0] TypeError: 'dict_keys' object does not support indexing 

Finalmente, convierto dict.keys () a list @ 1st, y obtuve el método de empalme de 1er miembro por lista:

 list(dict.keys())[0] 

para obtener una llave

 next(iter(mydict)) 

para obtener un valor

 next(iter(mydict.values())) 

para obtener ambos

 next(iter(mydict.items())) # or next(iter(mydict.viewitems())) in python 2 

Los dos primeros son Python 2 y 3. Los dos últimos son flojos en Python 3, pero no en Python 2.

Como han mencionado otros, no hay un “primer elemento”, ya que los diccionarios no tienen un orden garantizado (se implementan como tablas hash). Si desea, por ejemplo, el valor correspondiente a la clave más pequeña, thedict[min(thedict)] hará eso. Si te importa el orden en el que se insertaron las claves, es decir, “primero” significa “insertado lo más temprano posible”, luego en Python 3.1 puedes usar colecciones . para versiones anteriores de Python, descargue, instale y use el puerto de soporte dict dictado (2.4 y posterior) que puede encontrar aquí .

Python 3.7 Ahora los dicts están ordenados por inserción.

Qué tal esto. No se menciona aquí todavía.

py 2 y 3

 a = {"a":2,"b":3} a[list(a)[0]] # the first element is here >>> 2 

Ignorando los problemas relacionados con el ordenamiento de dict, esto podría ser mejor:

 next(dict.itervalues()) 

De esta manera evitamos la búsqueda de elementos y generamos una lista de claves que no usamos.

Python3

 next(iter(dict.values())) 

En python3

 list(dict.values())[0] 

Siempre puedes hacer:

 for k in sorted(d.keys()): print d[k] 

Esto le dará un conjunto de claves ordenadas consistentemente (con respecto a .hash () supongo) que puede procesar si la clasificación tiene algún significado para usted. Eso significa que, por ejemplo, los tipos numéricos se ordenan de manera consistente incluso si amplía el diccionario.

EJEMPLO

 # lets create a simple dictionary d = {1:1, 2:2, 3:3, 4:4, 10:10, 100:100} print d.keys() print sorted(d.keys()) # add some other stuff d['peter'] = 'peter' d['parker'] = 'parker' print d.keys() print sorted(d.keys()) # some more stuff, numeric of different type, this will "mess up" the keys set order d[0.001] = 0.001 d[3.14] = 'pie' d[2.71] = 'apple pie' print d.keys() print sorted(d.keys()) 

Tenga en cuenta que el diccionario está ordenado cuando se imprime. Pero el conjunto de claves es esencialmente un hashmap!

Para Python 2 y 3:

 import six six.next(six.itervalues(d)) 

La forma más sencilla para python3:

 list(dict.keys())[0] 

No hay bibliotecas externas, funciona en Python 2.7 y 3.x:

 >>> list(set({"a":1, "b": 2}.values()))[0] 1 

Para una clave aribtraria simplemente deja fuera .values ​​()

 >>> list(set({"a":1, "b": 2}))[0] 'a' 

El dict subclases es un método, aunque no es eficiente. Aquí, si proporciona un número entero, devolverá d[list(d)[n]] ; de lo contrario, acceda al diccionario como se espera:

 class mydict(dict): def __getitem__(self, value): if isinstance(value, int): return self.get(list(self)[value]) else: return self.get(value) d = mydict({'a': 'hello', 'b': 'this', 'c': 'is', 'd': 'a', 'e': 'test', 'f': 'dictionary', 'g': 'testing'}) d[0] # 'hello' d[1] # 'this' d['c'] # 'is' 
 first_key, *rest_keys = mydict