簡體   English   中英

從列表中刪除 NOT 重復值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM