有关更改地图表达式中的功能的建议

时间:2014-01-28 03:44:34

标签: python function numpy

我想知道是否有更简洁的方法来执行以下操作:

htr为numpy数组时,我想执行以下操作:

hL, tL, rL = map(lambda m: len(set(m)), [h, t, r])

计算单个数组中非重复项的数量。然而,lambda表达像拇指一样伸出。如果不重复的事情不是问题,我会写:

hL, tL, rL = map(len, [h, t, r])

哪个更酷。我们完整地分配了lambda表达式。在Haskell中涉猎了几个月之后,我真的开始相信Python应该能够在Haskell中提供像.这样的链接运算符,以便第一个表达式可以简单地简化为以下内容:

hL, tL, rL = map(len . set, [h, t, r])

哪个好多了!!

我看到使用reduce方法执行此操作的内容,但这比前一种方法更难看。我想知道是否有人知道可以解决问题的东西?我知道非严格评估存在问题可能使程序不稳定,但是当我们处理这样的简单事情时,这应该不是一个问题吗?

2 个答案:

答案 0 :(得分:4)

要计算numpy数组中的唯一元素数,可以使用unique(x).sizelen(unique(x))(请参阅numpy.unique)。如果你真的想让这三个长度的计算成为“单线”,你可以写:

hL, tL, rL = [len(unique(x)) for x in h, t, r]

如果重要:对于中等到大的数组,unique(x)可能比set(x)快很多,但对于小数组,set(x)更快。 (我没有探究各种数组大小和数据类型的性能,所以我将保留“大”和“小”未定义。自己测试 - 但只有当这段代码是性能瓶颈时才会。)< / p>

答案 1 :(得分:3)

Python不提供合成运算符。

如何使用list comprehension

>>> h = [1,2,3]
>>> t = [1,1,1,1]
>>> r = [1,2,2,1]
>>> hL, tL, rL = [len(set(m)) for m in h, t, r]
>>> hL, tL, rL
(3, 1, 2)