[英]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
但我返回的是一個如下所示的列表:
mainlist = ['A', 'A', 'B', 'B', 'C', 'C', 'E'] #value "D" is not anymore present. Why?
我想返回的是這樣的列表:
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']
但真正的問題是:如何刪除列表中的非重復項?
您可以找到這樣的重復項:
duplicates = [item for item in mainlist if mainlist.count(item) > 1]
您可以使用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
對列表元素進行計數。 使用列表推導僅保留多次出現的元素。 請注意,列表不必排序。
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']
另一種解決方案,使用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']
您的問題在於您在對其進行迭代時進行操作。 刪除"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']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.