Tengo dos listas list1 y list2 como:

list1 = [4, 3, 20, 10]
list2 = ['a', 'f', 'd', 'b']

Quiero crear una nueva lista result basada en la condición de que si mi condición num==10 es True, entonces result debería contener el contenido de list1 más debería contener el contenido de list2. A continuación se muestra el código que probé:

num = 10
result = [element for element in list1 if num == 10 else list2]

Pero esto está elevando SyntaxError. ¿Cómo debo lograr esto?

La salida esperada para el código anterior es:

[4, 3, 20, 10]  # stored in `result`
3
Maryam 24 feb. 2018 a las 12:22

2 respuestas

La mejor respuesta

Si solo desea crear una nueva lista result basada en su condición num==10, simplemente puede hacer (sin necesidad de comprender la lista) :

>>> result = (list2, list1)[num==10]
>>> result
[4, 3, 20, 10]

El resultado anterior se basa en el hecho de que Python trata el valor booleano True y False como 1 y 0 respectivamente. Entonces, estamos obteniendo la lista deseada de la tupla según la condición.

Otras alternativas para realizar la misma tarea:

# Alternative 1: Using your `if`/`else` logic
result = (list1 if num == 10 else list2)

# Alternative 2: using `and`/`or` logic
result = (num == 10 and list1) or list2

Si la comprensión de la lista es obligatoria para usarla (puede ser para realizar alguna operación en los elementos), entonces puede usar comprensión de la lista con cualquiera de las condiciones anteriores como:

>>> num = 10
>>> list1 = [4, 3, 20, 10]
>>> list2 = ['a', 'f', 'd', 'b']

# Using tuple of lists with boolean index
>>> result = [element for element in (list2, list1)[num==10]]
>>> result
[4, 3, 20, 10]

# Using `if`/`else` logic
>>> result = [element for element in (list1 if num == 10 else list2)]
>>> result
[4, 3, 20, 10]

# Using using `and`/`or` logic
>>> result = [element for element in (num == 10 and list1) or list2]
>>> result
[4, 3, 20, 10]
3
Moinuddin Quadri 24 feb. 2018 a las 10:29

Solo faltan algunos paréntesis:

result = [element for element in (list1 if num == 10 else list2)]

Una lista de comprensión puede tener una condición de filtrado (comp_if en la referencia del idioma) de la siguiente manera:

[a for a in b if c]

En su versión actual, list1 es b y num == 10 es c, pero su else list2 adicional no es sintácticamente inválido.

Debe ser explícito en el sentido de que su expresión condicional es parte de b, lo que puede hacer con paréntesis.

5
jonrsharpe 24 feb. 2018 a las 09:33