¿Existe alguna forma en Python 2.7+ para hacer algo como lo siguiente?
{ something_if_true if condition else something_if_false for key, value in dict_.items() }
Sé que puedes hacer cualquier cosa con solo 'if':
{ something_if_true for key, value in dict_.items() if condition}
python
dictionary
dictionary-comprehension
diegueus9
fuente
fuente
dict
está hecho dekey:value
elementos, no estás construyendo undict
aquí sino unset
(ver conjunto de literales ).Respuestas:
Ya lo tienes:
A if test else B
es una expresión válida de Python. El único problema con su comprensión dict como se muestra es que el lugar para una expresión en una comprensión dict debe tener dos expresiones, separadas por dos puntos:La
if
cláusula final actúa como un filtro, que es diferente de tener la expresión condicional.fuente
{(a if condition else b): value for key, value in dict.items()}
funcionará.La respuesta de @ Marcin lo cubre todo, pero en caso de que alguien quiera ver un ejemplo real, agrego dos a continuación:
Digamos que tienes el siguiente diccionario de conjuntos
y desea crear un nuevo diccionario cuyas claves indiquen si la cadena
'a'
está contenida en los valores o no, puede usarcuyos rendimientos
Ahora supongamos que tiene dos diccionarios como este
y desea reemplazar las claves
d1
por las claves ded2
si sus valores respectivos son idénticos, podría hacerlo que da
fuente
d1
,d2
obtengoAttributeError: 'dict_values' object has no attribute 'index'
En caso de que tenga diferentes condiciones para evaluar las claves y los valores, la respuesta de @ Marcin es el camino a seguir.
Si tiene la misma condición para las claves y los valores, es mejor construir tuplas (clave, valor) en una expresión de generador que alimenta
dict()
:Es más fácil de leer y la condición solo se evalúa una vez por clave, valor.
Ejemplo con tomar prestado el diccionario de conjuntos de @ Cleb:
Supongamos que desea sufijo solamente
keys
cona
en suvalue
y desea que lavalue
reemplazó con la longitud del conjunto en un caso así. De lo contrario, el par clave-valor debería permanecer sin cambios.fuente
Otro ejemplo en el uso de if / else en la comprensión del diccionario
Estoy trabajando en la aplicación de escritorio de entrada de datos para mi propio trabajo de oficina, y es común que dicha aplicación de entrada de datos obtenga todas las entradas del widget de entrada y las descargue en un diccionario para su posterior procesamiento como validación o edición, que debemos devolver datos seleccionados desde el archivo de regreso a los widgets de entrada, etc.
La primera ronda con codificación tradicional (8 líneas):
En la segunda ronda, intenté usar la comprensión del diccionario, pero el bucle sigue ahí (6 líneas):
Finalmente, con una declaración de comprensión de diccionario de una línea (1 línea):
Yo uso python 3.8.3
fuente