recorrer - lista dentro de un diccionario python
filtrar elementos en un diccionario python donde las claves contienen una cadena especĂfica (5)
¿Qué tal una comprensión dict :
filtered_dict = {k:v for k,v in d.iteritems() if filter_string in k}
Uno lo ve, debería ser autoexplicativo, ya que se lee bastante bien en inglés.
Esta sintaxis requiere Python 2.7 o superior.
En Python 3, solo hay dict.items()
, no iteritems()
por lo que debería usar:
filtered_dict = {k:v for (k,v) in d.items() if filter_string in k}
Soy un codificador de C desarrollando algo en python. Sé cómo hacer lo siguiente en C (y por lo tanto en lógica similar a C aplicada a Python), pero me pregunto cuál es la forma de hacerlo de ''Python''.
Tengo un diccionario d, y me gustaría operar en un subconjunto de los elementos, solo aquellos cuya clave (cadena) contiene una subcadena específica.
es decir, la lógica C sería:
for key in d:
if filter_string in key:
# do something
else
# do nothing, continue
Me estoy imaginando que la versión de Python sería algo así como
filtered_dict = crazy_python_syntax(d, substring)
for key,value in filtered_dict.iteritems():
# do something
He encontrado un montón de publicaciones aquí sobre el filtrado de diccionarios, pero no pude encontrar uno que involucrara exactamente esto.
Mi diccionario no está anidado y estoy usando Python 2.7
Elija lo que sea más legible y fácil de mantener. El hecho de que pueda escribirlo en una sola línea no significa que deba hacerlo. Su solución actual es similar a la que yo usaría, aparte de los elementos de usuario para omitir la búsqueda de valor, y odio los if if anidados si puedo evitarlos:
for key, val in d.iteritems():
if filter_string not in key:
continue
# do something
Sin embargo, si realmente quieres algo que te permita iterar a través de un dict filtrado, entonces no haría el proceso de dos pasos de construir el dict filtrado y luego iterar a través de él, sino usar un generador, porque lo que es más pitónico (e impresionante) que un generador?
Primero creamos nuestro generador, y un buen diseño exige que lo hagamos lo suficientemente abstracto como para ser reutilizable:
# The implementation of my generator may look vaguely familiar, no?
def filter_dict(d, filter_string):
for key, val in d.iteritems():
if filter_string not in key:
continue
yield key, val
Y luego podemos usar el generador para resolver su problema agradable y limpiamente con un código simple y comprensible:
for key, val in filter_dict(d, some_string):
# do something
En resumen: los generadores son geniales.
Jonathon te dio un enfoque usando las comprensiones dictas en su respuesta . Aquí hay un enfoque que trata con su parte de hacer algo .
Si quiere hacer algo con los valores del diccionario, no necesita una comprensión del diccionario en absoluto:
Estoy usando iteritems(
) desde que etiquetaste tu pregunta con python-2.7
results = map(some_function, [(k,v) for k,v in a_dict.iteritems() if ''foo'' in k])
Ahora el resultado estará en una lista con some_function
aplicada a cada par clave / valor del diccionario, que tiene foo
en su clave.
Si solo quiere tratar con los valores e ignorar las claves, simplemente cambie la comprensión de la lista:
results = map(some_function, [v for k,v in a_dict.iteritems() if ''foo'' in k])
some_function
puede ser invocable, por lo que una lambda también funcionaría:
results = map(lambda x: x*2, [v for k,v in a_dict.iteritems() if ''foo'' in k])
La lista interna en realidad no es necesaria, ya que también puede pasar una expresión del generador al mapa:
>>> map(lambda a: a[0]*a[1], ((k,v) for k,v in {2:2, 3:2}.iteritems() if k == 2))
[4]
Puede utilizar la función de filtro incorporada para filtrar diccionarios, listas, etc. en función de las condiciones específicas.
filtered_dict = dict(filter(lambda items:filter_str in item[0], d.items()))
La ventaja es que puede usarlo para diferentes estructuras de datos.
input = {"A":"a", "B":"b", "C":"c"}
output = {k:v for (k,v) in input.items() if key_satifies_condition(k)}