【问题标题】:Removing duplicate element from a list and the element itself从列表中删除重复元素和元素本身
【发布时间】:2011-03-09 12:36:42
【问题描述】:

我知道这个问题已经被问过很多次了,但我并不是在问如何仅从列表中删除重复元素,我也想删除重复的元素。

例如,如果我有一个列表:

x = [1, 2, 5, 3, 4, 1, 5]

我希望列表是:

x = [2, 3, 4] # removed 1 and 5 since they were repeated

我不能使用set,因为这将包括15

我应该使用Counter 吗?有没有更好的办法?

【问题讨论】:

    标签: python list unique


    【解决方案1】:

    这应该使用Counter 对象来完成。这是微不足道的。

    from collections import Counter
    x = [k for k, v in Counter([1, 2, 5, 3, 4, 1, 5]).iteritems() if v == 1]
    print x
    

    输出:

    [2, 3, 4]
    

    【讨论】:

    • +1。也许:k, v -> (k, v) / "k" -> item / "v" -> "occurrences"。以及 py3.0 中的“iteritems”->“items”
    【解决方案2】:

    也许这样:

    [_ for _ in x if x.count(_) == 1]
    

    编辑:就时间复杂度而言,这不是最好的方法,正如您在上面的评论中看到的那样,对不起我的错误。

    【讨论】:

    • 这是O(n^2)。使用 dict 或 Counter 可以为您提供 O(n) 并且并不难。
    【解决方案3】:

    一些更冗长和 O(n) 的东西:

    x = [1, 2, 2, 3, 4]
    
    def counts_fold(acc, x):
        acc[x] = acc[x]+1 if x in acc else 1
        return acc
    
    counts = reduce(counts_fold, x, {})
    
    y = [i for i in x if counts[i] == 1]
    
    print y
    

    【讨论】:

    • OP 已经建议使用Counter,他到底为什么要复制它的功能?
    • 糟糕,我没有注意到最后一行。我想我前段时间忘记了 Counter 的东西,很高兴能想起它。
    【解决方案4】:

    怎么样

    重复=设置(x) x = [elem for elem in x if elem not in duplicates]

    这样做的好处是 O(n) 而不是 O(n^2)。

    编辑。确实是我的错,我一定是半睡半醒。 Mahmoud 上面的答案是正确的。

    【讨论】:

    • 你的duplicates 不是重复的集合,它是所有元素的集合,x 最终会是空的,不是吗?
    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多