4 回答
TA贡献1818条经验 获得超3个赞
除+和*之外,我为它找到的其他用途是和和或或,但现在我们有any
和all
来替换这些情况。
foldl
并foldr
确实在Scheme中大放异彩...
这是一些可爱的用法:
整理清单
目标:[[1, 2, 3], [4, 5], [6, 7, 8]]
变成[1, 2, 3, 4, 5, 6, 7, 8]
。
reduce(list.__add__, [[1, 2, 3], [4, 5], [6, 7, 8]], [])
数字列表到一个数字
目标:[1, 2, 3, 4, 5, 6, 7, 8]
变成12345678
。
丑陋,缓慢的方式:
int("".join(map(str, [1,2,3,4,5,6,7,8])))
漂亮的reduce
方式:
reduce(lambda a,d: 10*a+d, [1,2,3,4,5,6,7,8], 0)
TA贡献1863条经验 获得超2个赞
reduce()可用于查找3个或更多数字的最小公倍数:
#!/usr/bin/env python
from fractions import gcd
from functools import reduce
def lcm(*args):
return reduce(lambda a,b: a * b // gcd(a, b), args)
例子:
>>> lcm(100, 23, 98)
112700
>>> lcm(*range(1, 20))
232792560
TA贡献1848条经验 获得超6个赞
reduce()可以用来解析点名(eval()太不安全了,无法使用):
>>> import __main__
>>> reduce(getattr, "os.path.abspath".split('.'), __main__)
<function abspath at 0x009AB530>
TA贡献1906条经验 获得超10个赞
找到N个给定列表的交集:
input_list = [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7]]
result = reduce(set.intersection, map(set, input_list))
返回:
result = set([3, 4, 5])
添加回答
举报