recorrer - lista de diccionarios python
Accede a un elemento arbitrario en un diccionario en Python (13)
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.
Si un mydict
no está vacío, mydict
a un elemento arbitrario como:
mydict[mydict.keys()[0]]
¿Hay alguna manera mejor de hacer esto?
Como han mencionado otros, no hay "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)]
lo hará. 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 collections.OrderedDict . para versiones anteriores de Python, descargue, instale y use el puerto de soporte dict dictado (2.4 y posterior) que puede encontrar here .
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.
En python3
list(dict.values())[0]
En python3, el camino:
dict.keys()
devuelva 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]
Ignorando los problemas relacionados con el orden de dictado, 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()))
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''
Para Python 2 y 3:
import six
six.next(six.itervalues(d))
Qué tal esto. No se menciona aquí todavía.
py 2 & 3
a = {"a":2,"b":3}
a[list(a)[0]] # the first element is here
>>> 2
Si solo necesita acceder a un elemento (siendo el primero por casualidad, ya que los dicts 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.
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!
Subclasificar dict
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''