【问题标题】:Is there a standard name for this function?这个函数有标准名称吗?
【发布时间】:2010-12-05 01:20:33
【问题描述】:

如果将函数应用于所有元素给出相同的结果,你会如何命名一个接受列表和函数并返回 True 的函数?

def identical_results(l, func):
    if len(l) <= 1: return True
    result = func(l[0])
    for el in l[1:]:
        if func(el) != result:
            return False
    return True

这个东西有一个普遍接受的好名字吗?如果你能以一种不那么笨重的方式实现,那么你会得到奖励。

【问题讨论】:

    标签: functional-programming terminology naming higher-order-functions


    【解决方案1】:

    在 .NET 中,最接近的是 Array.TrueForAll

    也许SameForAll 更适合这个功能?

    【讨论】:

    • 哦,谢谢:SameForAll 确实是我听过的最好的提议
    【解决方案2】:

    还没有听说过它的特殊名称(有点类似于Forall,但不完全是)。 IdenticalResults 看起来还不错(Jon Seigel 提议 SameForAll,也不错)

    另外:这是在 Haskell 中使用all 函数(.NET 下的TrueForall)实现这一点的方式

    ident [] = True
    ident (x:xs) = all (== x) xs
    
    sameForAll f = ident . map f
    

    还有 Python:

    def idents(f, list):
        if len(list) <= 1:
            return True
        else:
            let fx0 = f(list[0])
            return all(( f(x) == fx0 for x in list[1:] ))
    

    【讨论】:

    • 如果函数在域上保持不变,这几乎是在测试。
    • 不确定 Haskell 的,但如果所有项目都相同,python 似乎返回 True。这很酷,因为现在我可以调用 idents(map(f, list)) 来实现 SameForAll。修正你的代码,这样我就可以给你一个赞成票...
    • 糟糕,我忘了申请 f ;-)
    • 哦,我想我得到的是 Haskell 的,你应该先 \el -&gt; f el == f x\el -&gt; el = x 然后 sameforall = idents map(对吗?)
    • @Dario 但如果您使用 map 执行此操作,您只能在第一个元素上调用 f 一次。
    【解决方案3】:

    目前想不出一个好名字,但这个名字也一样:

    def identical_results(l, func):
        return len(set(map(func, l))) <= 1
    

    【讨论】:

    • 非常简洁的代码,但效率低下,因为创建一个集合需要 O(n log n) 而算法应该只需要 O(n)。
    • @Dario:是的,如果这是个问题的话。
    • 是的,正确的想法 balpha。 reduce() 将合并结果而不创建集合: def same_results(l, func): return reduce(lamdba x,y: x and y, map(func, l)) 因为它是 map+reduce,所以这也是高度可扩展的(参见 Google 的 Mapreduce 论文)。
    • @Lee B:你提议的功能不一样。
    • 在 Python 中,集合被实现为哈希表,而不是二叉树,因此集合的创建是 O(n),而不是 O(n log n)。
    【解决方案4】:

    identical_results 在我看来是一个合理的名称。

    【讨论】:

      【解决方案5】:

      我在上面的评论中发布了这个,但格式搞砸了,所以为了清楚起见,再次在这里:

      def identical_results(l, func):
          return reduce(lamdba x,y: x and y, map(func, l))
      

      【讨论】:

      • 我认为你的想法是对的,但现在你已经实现了 TrueForAll 而不是 SameAll
      • 正确。我在想这个函数可以完成所有的工作(它可以),但是如果 reduce 检查一个数组并且只添加新值可能会更好。无论如何,这几乎是一个集合,就像上面建议的 balpha 一样。
      猜你喜欢
      • 2017-01-19
      • 2015-12-27
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多