从列表中删除不重复的值

Remove NOT duplicates value from list

场景是这样的:

加入多个列表后使用:

list1 = ["A","B"]
list2 = ["A","B","C"]
list3 = ["C","D","E"]

mainlist = list1 + list2 + list3
mainlist.sort()

主列表现在看起来像这样:

mainlist = ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'E']

我想删除所有不重复的值。如果所讨论的值已经存在于列表中,则不得对其进行修改,而如果它仅在主列表中出现一次,我想将其删除。

我尝试使用这种方法,但似乎有些东西不起作用:

for i in mainlist:
    if mainlist.count(i) <= 1:
        mainlist.remove(i)
    else:
        continue

但我 return 是一个如下所示的列表:

mainlist = ['A', 'A', 'B', 'B', 'C', 'C', 'E'] #value "D" is not anymore present. Why?

我想要 return 是这样的列表:

mainlist = ['A', 'A', 'B', 'B', 'C', 'C'] #All values NOT duplicates have been deleted

我可以使用以下代码删除重复项:

for i in mainlist:
    if mainlist.count(i) > 1:
        mainlist.remove(i)
    else:
        continue

然后作为最终结果:

mainlist = ['A','B','C']

但真正的问题是:如何删除列表中的非重复项?

您可以使用 collections.Counter() 来跟踪每个项目的频率:

from collections import Counter

counts = Counter(mainlist)
[item for item in mainlist if counts[item] > 1]

这输出:

['A', 'A', 'B', 'B', 'C', 'C']

使用collections.Counter to count the list elements. Use list comprehension只保留出现多次的元素。请注意,列表不必排序。

from collections import Counter
list1 = ["A","B"]
list2 = ["A","B","C"]
list3 = ["C","D","E"]
mainlist = list1 + list2 + list3

cnt = Counter(mainlist)
print(cnt)
# Counter({'A': 2, 'B': 2, 'C': 2, 'D': 1, 'E': 1})

dups = [x for x in mainlist if cnt[x] > 1]
print(dups)
# ['A', 'B', 'A', 'B', 'C', 'C']

你的问题在于你在迭代它的同时操作它。删除 "D" 后,循环停止,因为列表中没有更多元素作为索引 6 处的 "E"

创建列表的副本并只对该列表进行操作:

new_list = list(mainlist)
for i in mainlist:
    if mainlist.count(i) <= 1:
        new_list.remove(i)
    else:
        continue

如果您只想输出列表中重复元素的列表,您可以使用集合和推导来只保留重复元素。

list1 = ["A","B"]
list2 = ["A","B","C"]
list3 = ["C","D","E"]

fulllist = list1 + list2 + list3
fullset = set(list1) | set(list2) | set(list3)

dups = [x for x in fullset if fulllist.count(x) > 1]

print(dups)  # ['A', 'C', 'B']

您可以像这样找到重复项:

duplicates = [item for item in mainlist if mainlist.count(item) > 1]

另一个解决方案,使用numpy

u, c = np.unique(mainlist, return_counts=True)
out = np.repeat(u[c > 1], c[c > 1])
print(out)

打印:

['A' 'A' 'B' 'B' 'C' 'C']