从列表中删除不重复的值
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']
场景是这样的:
加入多个列表后使用:
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']