python - 使用元组作为 lambda 的参数会引发有关缺少所需位置参数的错误

标签 python python-3.x lambda

在另一个线程(Python splitting list based on missing numbers in a sequence)中我找到了这个解决方案:

data = [1,  4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]

for k, g in groupby(enumerate(data), lambda (i,x):i-x):
    print map(itemgetter(1), g)

我是 Python 新手,并尝试使其适应 Python 3.4:

for k, g in groupby(enumerate(data), lambda i,x :i-x):
    print('%s' % list(map(itemgetter(1), g)))

我收到此错误:

<lambda>() missing 1 required positional argument: 'x'

我(有限)的理解是,groupby 语句中的关键函数仍然链接到需要两个参数的 lambda 函数。是对的吗?更重要的是,有没有办法改编上面的代码?这是一个非常优雅和紧凑的解决方案。

最佳答案

我的回答有点晚了,但希望对以后有所帮助。 是的你是对的。从 Python 2 --> Python 3 转换的问题在于 Python 3 中的 lambda 不接受元组作为参数。 但是,有一个解决方案,这是通过将预期的序列参数绑定(bind)到单个参数然后在该参数上建立索引来完成的:

lambda (i,x):i-x

将变成:

lambda x: x[1]-x[0]

因此,在 Python 3 中运行的代码将是:

from operator import itemgetter
import itertools
# Find runs of consecutive numbers using groupby.  The key to the solution
# is differencing with a range so that consecutive numbers all appear in
# same group.
L = [ 1,  4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]
for k, g in itertools.groupby( enumerate(L), lambda x: x[1]-x[0] ) :
  print (list(map(itemgetter(1), g)))

它将输出:

[1]
[4, 5, 6]
[10]
[15, 16, 17, 18]
[22]
[25, 26, 27, 28]

请在此处查看有关带有​​元组的 lambda 的更多信息: python3-equivalent-for-auto-tuple-unpacking-in-lambda

关于python - 使用元组作为 lambda 的参数会引发有关缺少所需位置参数的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35181413/

相关文章:

python - Matplotlib 循环中的图形没有响应

python - 为什么对浮点的简单数学运算会在 VB.Net 和 Python 中返回意外(不准确)的结果?

bash - 如何通过管道将一个 python 脚本的输出作为另一个 python 脚本的输入?

xml - Python - 将 XML 转换为 CSV

c++ - 存储在 std::function 中时,无捕获 lambda 无法转换为函数指针

Python C 扩展 : Py_DECREF for PyList

python - Flask + AngularJS - 使用 url_for()

python - 如何获取内置模块上重写内置方法的原始版本?

c++ - 在 C++ 中优雅地移植 lambda 表达式

python - 如何使用 lambda 和 hasattr 过滤嵌套属性上的对象数组?