如函数式编程 HOWTO 中所述,要使用列表推导式创建元组列表,必须使用括号。特别是,这在以下引用的文档中有所表达。
为了避免在 Python 的语法中引入歧义,如果表达式 正在创建一个元组,它必须用括号括起来。
因此,例如:
[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
Run Code Online (Sandbox Code Playgroud)
通过强制使用括号来表达使用列表推导式的元组列表可以避免什么歧义?
经过大量的邮件列表挖掘,我发现了一个非常明确的声明,即解析器可以很好地处理它。括号是强制性的,以使含义更清楚。这是2000 年 Guido 在 python-dev 邮件列表中的引用:
别担心。Greg Ewing 用 Python 自己的语法表达这一点没有问题,这与解析器一样受到限制。(它是 LL(1),相当于带有一个前瞻标记的纯递归下降,即没有回溯。)
这是 Greg 的语法:
Run Code Online (Sandbox Code Playgroud)atom: ... | '[' [testlist [list_iter]] ']' | ... list_iter: list_for | list_if list_for: 'for' exprlist 'in' testlist [list_iter] list_if: 'if' test [list_iter]请注意,之前的列表语法是
'[' [testlist] ']'. 让我用不同的术语来解释它:解析器解析一系列以逗号分隔的表达式。以前,它希望
']'成为此后唯一可能的令牌。更改后,'for'是另一个可能的后续令牌。对于任何知道如何解析匹配括号的解析器来说,这根本不是问题!如果你不想支持,
[x, y for ...]因为它是模棱两可的(对于人类读者,而不是解析器!),我们可以将语法更改为:Run Code Online (Sandbox Code Playgroud)'[' test [',' testlist | list_iter] ']'(注意
|绑定小于连接,[...]表示可选部分。)
另请参阅线程中的下一个响应,其中 Greg Ewing 运行
>>> seq = [1,2,3,4,5]
>>> [x, x*2 for x in seq]
[(1, 2), (2, 4), (3, 6), (4, 8), (5, 10)]
Run Code Online (Sandbox Code Playgroud)
在列表理解补丁的早期版本上,它工作得很好。
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |