编程语言
首页 > 编程语言> > Python3中的单行减少

Python3中的单行减少

作者:互联网

Python3中,我正在寻找一种方法来在一行中计算一个由两个元素两次调用的lambda函数.假设我想计算整数列表的LCM,这可以在one line in Python2中完成:

print reduce(lambda a,b: a * b // gcd(a, b), mylist)

是否可以在一行Python3中执行相同的操作(暗示,没有functools.reduce)?

在Python3中,我知道filter,map和reduce已经消失了.我不觉得我需要过滤器和地图了,因为它们可以用更短更清晰的方式用Python3编写,但我认为我还能找到一个很好的替代品,除了我没有找到任何东西.我have看过many文章that建议to使用functools.reduce或“write out the accumulation loop explicitly”但我想这样做而不需要导入functools并且在一行中.

如果它变得更容易,我应该提到我使用associativecommutative的函数.例如,在列表[1,2,3,4]上有一个函数f,如果计算结果将是好的:

> f(1,f(2,f(3,4)))
> f(f(1,2),f(3,4))
> f(f(3,f(1,4)),2)
>或任何其他订单

解决方法:

所以我确实想出了一些东西.我不保证性能,但它是一个单行使用lambda函数 – 没有functools或itertools,甚至没有一个循环.

my_reduce = lambda l, f: (lambda u, a: u(u, a))((lambda v, m: None if len(m) == 0 else (m[0] if len(m) == 1 else v(v, [f(m[0], m[1])] + m[2:]))), l)

这有点难以理解,所以在这里扩展:

my_reduce = lambda l, f: (
    lambda u, a: u(u, a)) (
        (lambda v, m: None if len(m) == 0
                           else (m[0] if len(m) == 1
                                      else v(v, [f(m[0], m[1])] + m[2:])
                                )
        ),
        l
    )

测试:

>>> f = lambda a,b: a+b
>>> my_reduce([1, 2, 3, 4], f)
10
>>> my_reduce(['a', 'b', 'c', 'd'], f)
'abcd'

请查看this other post以获得有关其工作原理的更深入说明.

如果要通过使用第一个参数是函数的lambda函数来模拟递归函数的原则,它将是它自己.

这个递归函数嵌入在一个有效触发递归调用的函数内:lambda u,a:u(u,a).

最后,所有内容都包含在一个函数中,该函数的参数是列表和二进制函数.

将my_reduce与您的代码一起使用:

my_reduce(mylist, lambda a,b: a * b // gcd(a, b))

标签:python,python-3-x,python-2-x,reduce
来源: https://codeday.me/bug/20191006/1860084.html