【问题标题】:Delete unique elements from a list从列表中删除唯一元素
【发布时间】:2015-01-08 08:16:13
【问题描述】:

我在解决下一个问题时遇到了一些问题:

我们有一个元素列表(整数),我们应该返回一个列表,该列表仅包含该列表中的非唯一元素。不改变列表的顺序 我认为最好的方法是删除或移除所有唯一元素。

请注意,我刚开始学习 python,只想要最简单的解决方案。

这是我的代码:

def checkio(data):
    for i in data:
        if data.count(i) == 1:    #if element seen in the list just ones, we delet this el
            ind = data.index(i)
            del data[ind]
    return data

【问题讨论】:

  • 与其删除项目,不如创建一个具有唯一值的新列表?
  • @JoErNanO 我需要一个包含非唯一元素的列表(所有元素都具有原始顺序)
  • 只需使用 set() 函数将列表转换为集合,您将获得所需的输出。如果您想在列表中找到最终答案,只需使用 list() 函数将该集合转换为列表即可。

标签: python list unique


【解决方案1】:

你可以实现一个OrderedCounter,例如:

from collections import OrderedDict, Counter

class OrderedCounter(Counter, OrderedDict): 
    pass

data = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2]

duplicates = [k for k, v in OrderedCounter(data).items() if v > 1]
# [1, 3, 2, 5]

因此,您计算每个值的出现次数,然后过滤它的频率是否超过 1。从OrderedDict继承意味着保留原始元素的顺序。


通过 cmets,您希望保留所有重复的元素,因此您可以预先构建一组重复条目,然后重新迭代您的原始列表,例如:

from collections import Counter

data = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2]
duplicates = {k for k, v in Counter(data).items() if v > 1}
result = [el for el in data if el in duplicates]
# [1, 3, 1, 2, 3, 5, 1, 5, 2]

【讨论】:

    【解决方案2】:

    试试这个:

    >>> a=[1,2,3,3,4,5,6,6,7,8,9,2,0,0]
    >>> a=[i for i in a if a.count(i)>1]
    >>> a
    [2, 3, 3, 6, 6, 2, 0, 0]
    >>> a=[1, 2, 3, 1, 3]
    >>> a=[i for i in a if a.count(i)>1]
    >>> a
    [1, 3, 1, 3]
    >>> a=[1, 2, 3, 4, 5]
    >>> a=[i for i in a if a.count(i)>1]
    a
    []
    

    【讨论】:

    • 定义了所有非唯一元素。示例 1:[1, 2, 3, 1, 3] -->> 1 和 3 个非唯一元素,结果将是 [1, 3, 1, 3]。示例 2:[1, 2, 3, 4, 5] -->> 非唯一元素,结果将是 []
    【解决方案3】:

    你的函数可以通过反向迭代列表来工作:

    def checkio(data):
        for index in range(len(data) - 1, -1, -1):
            if data.count(data[index]) == 1:
                del data[index]
        return data
    
    print(checkio([3, 3, 5, 8, 1, 4, 5, 2, 4, 4, 3, 0]))
    [3, 3, 5, 4, 5, 4, 4, 3]
    print(checkio([1, 2, 3, 4]))
    []
    

    这行得通,因为它只删除列表中已经被迭代的部分中的数字。

    【讨论】:

    • 这具有二次运行时间复杂度。更好的 (O(n)) 解决方案是use a Counter
    【解决方案4】:

    按照您的开始,迭代整数列表,但不计算或删除元素,尝试仅测试该元素是否已被看到,将其附加到重复元素列表中:

    def checkio(data):
        elements = []
        duplicates = []
        for i in data:
            if i not in elements:
                elements.append(i)
            else:
                if i not in duplicates:
                    duplicates.append(i)
        return duplicates
    
    d = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2]
    
    print (checkio(d))
    #[1, 3, 5, 2]
    

    【讨论】:

    • d = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2] 结果应该是 --->>> [1, 3, 1, 2, 3 , 5, 1, 5, 2](删除了唯一的 '8')
    【解决方案5】:

    我只是使用了列表理解。

    def checkio(data):
        a=[i for i in data if data.count(i)>1]
        return a
    print checkio([1,1,2,2,1,1,1,3,4,5,6,7,8]) 
    

    【讨论】:

      【解决方案6】:
      def checkio(data):
          lis = []
          for i in data:
              if data.count(i)>1:
                  lis.append(i)
          print(lis)
      checkio([1,2,3,3,2,1])
      

      是的,为这个线程做贡献有点晚了,但只是想把它放在网上供其他人使用。

      【讨论】:

        【解决方案7】:
         numbers = [1, 1, 1, 1, 3, 4, 9, 0, 1, 1, 1]
         x=set(numbers)
         print(x)
        

        您也可以使用 set 关键字来获得所需的解决方案。

        【讨论】:

          【解决方案8】:

          每次在 while 循环中修改列表时,我都使用整数和布尔值进行检查。

          rechecks = 1
          runscan = True
          while runscan == True:
              for i in data:
                   if data.count(i) <2:
                       data.remove(i)
                       rechecks+=1
                      #need to double check now
              if rechecks >0:
                  runscan = True
                  rechecks-=1
              else:
                  runscan = False       
          return data
          

          【讨论】:

            【解决方案9】:

            生成一个新列表不是更容易吗?

            def unique_list(lst):
                new_list = []
                for value in lst:
                    if value not in new_list:
                        new_list.append(value)
                return new_list
            
            lst = [1,2,3,1,4,5,1,6,2,3,7,8,9]
            print(unique_list(lst))
            

            打印 [1,2,3,4,5,6,7,8,9]

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-06-14
              • 1970-01-01
              • 2018-11-05
              • 1970-01-01
              • 2017-03-05
              相关资源
              最近更新 更多