resueltos recorrer lista elementos ejercicios ejemplo diccionarios diccionario dentro convertir agregar python python-2.7 dictionary filtering

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)}