Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 还原为非标量值有用/有用吗?_Python_Functional Programming_Reduce - Fatal编程技术网

Python 还原为非标量值有用/有用吗?

Python 还原为非标量值有用/有用吗?,python,functional-programming,reduce,Python,Functional Programming,Reduce,通常,我会看到一个减少,减少一些序列成一个值。仅使用最基本的示例,让我们进行sum和count减少: # sum >>> reduce(lambda x,y: x+y, [1,2,3]) # 6 # count reduce(lambda x,y: x+1, [3,4,5], 0) # 3 是否使用过不产生标量值的缩减?下面是一个玩具示例: >>> reduce(lambda x,y: x+[y+2,], [1,2,3], []) [3, 4, 5] 如

通常,我会看到一个减少,减少一些序列成一个值。仅使用最基本的示例,让我们进行
sum
count
减少:

# sum
>>> reduce(lambda x,y: x+y, [1,2,3])
# 6

# count
reduce(lambda x,y: x+1, [3,4,5], 0)
# 3
是否使用过不产生标量值的缩减?下面是一个玩具示例:

>>> reduce(lambda x,y: x+[y+2,], [1,2,3], [])
[3, 4, 5]

如果是这样的话,在Python中,减少生成另一个序列而不是最终(ish)标量值的实际用途是什么?通常不会,尽管这是惯例

从更一般的意义上讲,将集合简化为非标量通常是有意义的,在函数式语言中,这通常是构建或转换集合的一种方法。尤其是当您需要在迭代时对累积的聚合执行逻辑时

考虑以下Javascript。JS可能功能性不强,但其for循环非常丑陋,因此使用功能性重音编写已成为一种时尚:

xs.reduce((coll,x)=>{
常数{value,id}=x;
如果(!(coll中的id)){
coll[id]=[];
}
coll[id].push(x);
返回coll;
}, {});
此缩减会获取如下数据,就像从REST端点获取的数据一样:

[{"id": 5, "value": "a"}, {"id": 5, "value": "b"}, {"id": 7, "value": "a"}]
让它看起来像这样:

{"5": ["a", "b"], "7": ["a"]}
我每天至少在Javascript标签中看到一个归结为这个问题的问题

在Python中,考虑到lambdas的局限性,您需要创建一个定制的reduce函数来实现相同的效果,但实际上变化不大:

def减速器(coll,x):
x_id=str(x[“id”])
coll[x_id]。追加(x[“值”])
返回科尔
xs=[{“id”:5,“value”:“a”}…]
结果=减少(减速机、xs、defaultdict(列表))
打印(结果)#{'5':['a','b'],'7':['a']}

在Python中基本上是一样的,尽管
defaultdict
使其更短。但是在Python中,对于简单情况的列表理解(它们是简洁和性能的罕见组合)以及对于更复杂的情况的循环,有一个强大的约定。不幸的是,
reduce
和friends都不是很Pythonic,而且因为代码在与其他程序员交流中起着不小的作用,所以最不令人惊讶的原则是,yadda-yadda。

作为中间产品,被另一个生成标量产品的reduce使用?@Sebastian我明白了,那么你想举一个例子吗(这与仅仅做另一个
映射有什么区别?)[回答我的问题]哦……不
映射只能在序列中使用一个值,而reduce本质上可以访问多个值,所以这可能是一个区别)。请注意,你的玩具示例实际上只是“列表理解做得很差:
result=[x+2 for x in[1,2,3]]
,不需要lambda。因此,最好先有一个其他列表操作没有意义的实际用例。或者看起来很笨拙。一个不会改变类型构造函数的缩减(在您的示例中为
[]
)见证了这样一个事实,
reduce
map
更通用,因为您可以用前者来表达后者。但是,如果类型构造函数从
[]
更改为map(例如,我不知道Python的内置类型),则更有趣。我认为这非常有用。如果您有嵌套的list
数据=[[1,2],[3,4],[5,6]
然后使用
reduce(lambda x,y:x+y,data,[])
您可以将其简化为扁平化列表
[1,2,3,4,5,6]
。但您也可以使用
求和(data,[])
。可能您看不到这种类型的缩减,因为人们更喜欢使用正常的
进行
循环或列表理解。