从列表中删除重复元素,但只删除重复数为奇数的元素

2024-04-26 10:46:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从列表中删除重复元素,它的重复数是奇数。 例如下面的列表:[1, 2, 3, 3, 3, 5, 8, 1, 8]我有1个重复了2次,3个重复了3次,8个重复了2次。所以1和8应该被去掉,而不是3的3个元素,我只需要留下1。在

这就是我想到的:

def remove_odd_duplicates(arr):
    h = {}
    for i in arr:
        if i in h:
            h[i] += 1
        else:
            h[i] = 1

    arr = []
    for i in h:
        if h[i] % 2:
            arr.append(i)

    return arr

它正确地返回所有内容:[2, 3, 5],但我相信这可以用更好的方式编写。有什么想法吗?在


Tags: in元素内容列表forreturnifdef
3条回答

如果顺序无关紧要:

>>> a = [1, 2, 3, 3, 3, 5, 8, 1, 8]
>>> list(set([x for x in a if a.count(x)%2 == 1]))
[2, 3, 5]

列表理解[x for x in a if a.count(x)%2 == 1]只返回在列表中出现奇数次的元素。list(set(...))是从列表中删除重复项的常用方法。在

您可以使用^{}和列表理解,如下所示

data = [1, 2, 3, 3, 3, 5, 8, 1, 8]
from collections import Counter
print [item for item, count in Counter(data).items() if count % 2]
# [2, 3, 5]

Counter给出了一个字典,输入iterable中的每个元素都是键,它们对应的计数是值。所以,我们迭代这个dict,检查计数是否为奇数,并只过滤掉那些项目。在

注意:这个解决方案的复杂性仍然是O(N),就像您最初的程序一样。在

您可以使用^{}

>>> from scipy.stats import itemfreq
>>> xs = [1, 2, 3, 3, 3, 5, 8, 1, 8]
>>> ifreq = itemfreq(xs)
>>> ifreq
array([[1, 2],
       [2, 1],
       [3, 3],
       [5, 1],
       [8, 2]])
>>> i = ifreq[:, 1] % 2 != 0
>>> ifreq[i, 0]
array([2, 3, 5])

相关问题 更多 >