【问题标题】:Make Python List Unique in Functional way (map/reduce/filter)使 Python 列表在功能上独一无二(map/reduce/filter)
【发布时间】:2012-11-25 07:42:46
【问题描述】:

在 Python 中有没有办法通过函数范式使 List 独一无二?

输入:[1,2,2,3,3,3,4]

输出:[1,2,3,4](按顺序保存)

我知道有other ways,但没有一个是功能性的。

【问题讨论】:

    标签: python map filter functional-programming


    【解决方案1】:

    通过功能范式使列表独一无二

    非常简单:您需要一个实体,它是一个集合,但也按照与初始列表中相同的顺序进行排序。

    sorted(set(input), key=lambda element: input.index(element))
    

    额外功能:当初始数组有重复元素时,不能保证存在排序(如[1,2,2,1] 的情况)。提供的代码行为与.index() 一样。此外,1 次排序可能比 n 次查找更快(但需要对实际数据进行计时)。

    【讨论】:

      【解决方案2】:

      你可以试试:

      In [29]: a = [1,2,2,3,3,3,4]
      
      In [30]: reduce(lambda ac, v: ac + [v] if v not in ac else ac, a, [])
      Out[30]: [1, 2, 3, 4]
      

      这使用列表累加器(ac)并检查当前值(v)是否已经在列表中;如果没有,添加新元素;如果是这样,只需返回列表。

      另外,这个完全没有价值/丑陋/误导,更多的是出于好奇(当然可以做得更好):

      In [11]: a = [1,2,2,3,3,3,4]
      
      In [12]: n = [None] * len(a)
      
      In [13]: map(lambda b, c:(lambda i=n.__setitem__:(i(c,b)))() if b not in n else None, a, range(len(a)))
      Out[13]: [None, None, None, None, None, None, None]
      
      In [14]: filter(lambda x: x, n)
      Out[14]: [1, 2, 3, 4]
      

      【讨论】:

        【解决方案3】:

        Python 没有有序集合,但您可以使用OrderedDict 作弊。好吧,它不是纯粹的功能,但确实在紧要关头。

        >>> from collections import OrderedDict
        >>> from itertools import repeat
        >>> x = [1,2,2,3,3,3,4]
        >>> OrderedDict(zip(x, repeat(None))).keys()
        [1, 2, 3, 4]
        

        【讨论】:

          【解决方案4】:

          如果您只需要删除相邻的匹配项,请尝试以下操作:

          reduce(lambda x,y: x+[y] if x==[] or x[-1] != y else x, your_list,[])
          

          如果您需要删除除一次之外的所有内容,请尝试以下操作:

          reduce(lambda x,y: x+[y] if not y in x else x, your_list,[])
          

          【讨论】:

          • 哈哈,+1 - 我想我们在同一时间提交了第二个选项 :)
          • 哈哈哈是真的。但我现在不能投票,我的积分还不到 15 分。未来的 +1 即将到来 :) ... 完成
          • 哈,你的积分在 17 秒内几乎翻了一番!你的答案是更好的,所以希望这也是你的第一个接受:)
          • 您应该能够通过将初始元素视为基本情况而不是空列表来稍微简化逻辑:reduce(lambda x,y: x+[y] if x[-1] != y else x, your_list[1:], your_list[0])
          【解决方案5】:
          try this one
          list(set([1,2,2,3,3,3,4])) will definitely return [1,2,3,4]
          
          as set contains unique elements
          
          Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
          32
          Type "help", "copyright", "credits" or "license" for more information.
          >>> list(set([1,2,2,3,3,3,4]))
          [1, 2, 3, 4]
          >>>
          

          【讨论】:

          • -1 这绝对不会保留顺序,因为sets 基本上是无序的集合。此外,从算法上讲,这忽略了输入已排序这一点,这应该允许对数据进行一次线性传递(set 的构造比散列的细节稍微复杂一些)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-20
          • 2017-06-07
          • 1970-01-01
          • 2012-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多