【问题标题】:remove elements which are present in a list more than 2 times删除列表中出现超过 2 次的元素
【发布时间】:2020-09-01 11:34:54
【问题描述】:

我想创建一个新列表,其中每个元素最多可以出现 2 次。 我的代码:

def valid_element(elements):
    removed = 0
    new_list = []
    for i in elements:
        if i not in new_list:
            new_list.append(i)
    else:
        removed += 1
    print(new_list)
    print('Removed:', removed)
valid_element([1, 2, 3, 3, 3, 3, 4, 5, 8, 8])

我想要的输出:

Removed: 2
[1, 2, 3, 3, 4, 5, 8, 8]

【问题讨论】:

    标签: python-3.x list conditional-statements


    【解决方案1】:

    您需要计算列表中的唯一元素..

    def valid_element(elements):
        removed = 0
        new_list = []
        for i in elements:
            if i not in new_list:
                new_list.append(i)
            elif i in new_list:
                repeat_count = new_list.count(i)
                if repeat_count < 2:
                    new_list.append(i)
                else:    
                    removed = i
        print(new_list)
        print('Removed:', removed)
    valid_element([1, 2, 3, 3, 3, 3, 4, 5, 8, 8])
    

    输出:

    [1, 2, 3, 3, 4, 5, 8, 8]
    Removed: 3
    

    【讨论】:

      【解决方案2】:

      您的示例按排序顺序显示项目。如果重复项彼此相邻,那么您可以这样做

      from itertools import groupby, islice
      
      alist = [1, 2, 3, 3, 3, 3, 4, 5, 8, 8]
      result = [i for k, g in groupby(alist) for i in islice(g, 2)]
      

      result 包含

      [1, 2, 3, 3, 4, 5, 8, 8]
      

      如果您需要知道删除了多少,您可以这样做

      num_removed = len(alist) - len(result)
      

      如果您的原始列表未按排序顺序,并且您不介意重新排序,那么请这样做

      result = [i for k, g in groupby(sorted(alist)) for i in islice(g, 2)]
      

      最后,这是一个保留顺序的版本

      from collections import Counter
      c = Counter()
      result = [i for i in alist if c.update([i]) or c[i] <= 2]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-11
        • 1970-01-01
        相关资源
        最近更新 更多