【问题标题】:Python 3.2 Lambda Syntax Error [duplicate]Python 3.2 Lambda 语法错误 [重复]
【发布时间】:2013-03-20 16:24:39
【问题描述】:
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 之间的语法差异,但一无所获。任何帮助或修复将不胜感激。

【问题讨论】:

  • 值得注意的是,在= 和参数之间放置空格是违反PEP-8 的建议的。

标签: python lambda syntax-error


【解决方案1】:

在 Python3 中不允许使用括号解包 lambda 中的参数。原因见PEP 3113

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

改为使用:

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

【讨论】:

  • 为什么要删除这个语法?
  • @Blender 它被证明很少使用,并且使函数注释之类的东西变得尴尬,并且增加了一些内省的复杂性。它也很容易更换。见PEP-3113
  • 非常感谢!这完美地工作。另外,这并不重要,但您是否知道为什么我必须将 iteritems() 更改为 items() 才能使用 python3 运行它?
  • @Zack iteritems() 在那里,因为 2.x 中的 items() 返回一个列表,这是内存效率低下的。在 3.x 中,items() 返回一个迭代器,不再需要 iteritems()
  • @Lattyware:感谢您回答所有问题 :)
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 2011-03-03
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
相关资源
最近更新 更多