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并且在一行中.
如果它变得更容易,我应该提到我使用associative和commutative的函数.例如,在列表[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