为什么Python 3中lambda函数中的括号会导致语法错误?

28
def sort_dictionary( wordDict ):
    sortedList = []
    for entry in sorted(wordDict.iteritems(), key = lambda (k, v): (-v, k) ):
        sortedList.append( entry )

    return sortedList

该函数将接收一个包含以下信息的字典:

{ 'this': 1, 'is': 1, 'a': 1, 'large': 2, 'sentence': 1 }

我希望它生成一个列表的列表,其中元素首先按字典的值从大到小排序,然后按键字母顺序排序。

当使用python 2.7.2运行函数时,它可以正常工作,但我收到以下错误:

  File "frequency.py", line 87
    for entry in sorted(wordDict.iteritems(), key = lambda (k, v): (-v, k)):
                                                           ^
SyntaxError: invalid syntax

当我使用Python 3.2.3运行程序时。

我一直在寻找原因或语法差异,包括2.7和3.2之间的差别,并且没有找到任何答案。非常感谢任何帮助或修复建议。


3
值得注意的是,在=和参数之间加空格违反了PEP-8的建议。 - Gareth Latty
1个回答

65

在Python3中,使用括号来解包lambda函数中的参数是不允许的。请查看PEP 3113,了解其原因。

lambda (k, v): (-v, k)

改用:

lambda kv: (-kv[1], kv[0])

为什么删除了这个语法? - Blender
5
@Blender它被证明使用很少,而且会使诸如函数注释之类的事情变得很尴尬,同时还增加了一些内省工作的复杂性。 它也非常容易被替换。请参见[PEP-3113](http://www.python.org/dev/peps/pep-3113/)。 - Gareth Latty
2
@Zack iteritems() 在2.x中作为 items() 存在,返回一个列表,这是内存效率低下的。在3.x中,items() 返回一个迭代器,消除了对 iteritems() 的需要。 - Gareth Latty
Python确实需要更好的语法文档来解释列表推导和lambda表达式。 - AdamC
1
@NarenBabuR 当调用该lambda时,需要两个不同的参数,而不是一个单独的元组。 - MEMark
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接