recorrer que ejemplo diccionario python dictionary dictionary-comprehension

ejemplo - que es un diccionario en python



¿Cómo usar if/else en la comprensión de un diccionario? (2)

En python2.7 + existe alguna forma de hacer algo como:

{ something_if_true if condition else something_if_false for key, value in dict_.items() }

Sé que puedes hacer cualquier cosa con solo ''si''

{ something_if_true for key, value in dict_.items() if condition}


Ya lo tienes: A if test else B es una expresión válida de Python. El único problema con tu 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:

{ (some_key if condition else default_key):(something_if_true if condition else something_if_false) for key, value in dict_.items() }

La cláusula If final actúa como un filtro, que es diferente de tener la expresión condicional.


La respuesta de @Marcin lo cubre todo, pero por si alguien quiere ver un ejemplo real, añado dos a continuación:

Digamos que tienes el siguiente diccionario de conjuntos

d = {''key1'': {''a'', ''b'', ''c''}, ''key2'': {''foo'', ''bar''}, ''key3'': {''so'', ''sad''}}

y desea crear un nuevo diccionario cuyas claves indiquen si la cadena ''a'' está contenida en los valores o no, puede usar

dout = {"a_in_values_of_{}".format(k) if ''a'' in v else "a_not_in_values_of_{}".format(k): v for k, v in d.items()}

cuyos rendimientos

{''a_in_values_of_key1'': {''a'', ''b'', ''c''}, ''a_not_in_values_of_key2'': {''bar'', ''foo''}, ''a_not_in_values_of_key3'': {''sad'', ''so''}}

Ahora supongamos que tienes dos diccionarios como este

d1 = {''bad_key1'': {''a'', ''b'', ''c''}, ''bad_key2'': {''foo'', ''bar''}, ''bad_key3'': {''so'', ''sad''}} d2 = {''good_key1'': {''foo'', ''bar'', ''xyz''}, ''good_key2'': {''a'', ''b'', ''c''}}

y desea reemplazar las claves en d1 por las teclas de d2 si los valores respectivos son idénticos, podría hacer

# here we assume that the values in d2 are unique dout2 = {d2.keys()[d2.values().index(v1)] if v1 in d2.values() else k1: v1 for k1, v1 in d1.items()}

lo que da

{''bad_key2'': {''bar'', ''foo''}, ''bad_key3'': {''sad'', ''so''}, ''good_key2'': {''a'', ''b'', ''c''}}