Como se señaló en el CÓMO de Programación Funcional , para crear una lista de tuplas usando la comprensión de la lista, se deben usar paréntesis. En particular, esto se expresa en el documento en la siguiente cita.
Para evitar introducir una ambigüedad en la gramática de Python, si la expresión está creando una tupla, debe estar entre paréntesis.
Entonces, como ejemplos:
[x, y for x in seq1 for y in seq2] # This is a syntex error
[(x, y) for x in seq1 for y in seq2] # This is a correct expression of list of tuples using list comprehension
¿Qué ambigüedad se evita al forzar el uso de paréntesis al expresar una lista de tuplas usando la comprensión de la lista?
python
python-3.x
Isaac a
fuente
fuente
Respuestas:
Después de un montón de búsqueda en la lista de correo, he encontrado una declaración bastante inequívoca de que el analizador estaba de acuerdo. Los paréntesis se hicieron obligatorios para aclarar el significado. Aquí hay una cita de Guido en 2000 en la lista de correo python-dev:
También vea la siguiente respuesta en el hilo, donde corre Greg Ewing
en una versión anterior del parche de comprensión de la lista, y funciona bien.
fuente
De los documentos :
Dentro de una lista, las tuplas de comprensión están anidadas dentro de una lista. Por lo tanto, deben estar entre paréntesis. Pero cuando no se anidan, por ejemplo,
the_tuples = 'a','b','c'
no son necesarios porque se reconocen automáticamente como tuplas en ese momento.fuente
Python tiene varios elementos sintácticos con paréntesis opcionales. En este caso, estos son:
tuple
literalx, y
y for x in seq1 for y in seq2
En casos inequívocos, estos se pueden usar sin paréntesis adicionales:
b = x, y
sum(y for x in seq1 for y in seq2)
Sin embargo, usar ambos en la misma expresión es ambiguo. Se requieren paréntesis para aclarar el significado:
[(x, y) for x in seq1 for y in seq2]
[x, (y for x in seq1 for y in seq2)]
Como por la gramática python3, lista de pantallas
[...]
se definen como que contiene o bien una lista de expresiones (a, b, *c, d
) o una comprensión (a for a in b
).fuente