簡體   English   中英

從列表中刪除唯一元素

[英]Delete unique elements from a list

我在解決下一個問題時遇到了一些問題:

我們有一個元素列表(整數),我們應該返回一個僅包含此列表中非唯一元素的列表。 在不改變列表順序的情況下,我認為最好的方法是刪除或刪除所有唯一元素。

請注意,我剛剛開始學習 Python,並且只想要最簡單的解決方案。

這是我的代碼:

def checkio(data):
    for i in data:
        if data.count(i) == 1:    #if element seen in the list just ones, we delet this el
            ind = data.index(i)
            del data[ind]
    return data

只是我使用了列表理解。

def checkio(data):
    a=[i for i in data if data.count(i)>1]
    return a
print checkio([1,1,2,2,1,1,1,3,4,5,6,7,8]) 

可以通過反向迭代列表來使您的函數工作:

def checkio(data):
    for index in range(len(data) - 1, -1, -1):
        if data.count(data[index]) == 1:
            del data[index]
    return data

print(checkio([3, 3, 5, 8, 1, 4, 5, 2, 4, 4, 3, 0]))
[3, 3, 5, 4, 5, 4, 4, 3]
print(checkio([1, 2, 3, 4]))
[]

這是有效的,因為它只刪除列表中已經迭代過的部分中的數字。

您可以實現OrderedCounter ,例如:

from collections import OrderedDict, Counter

class OrderedCounter(Counter, OrderedDict): 
    pass

data = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2]

duplicates = [k for k, v in OrderedCounter(data).items() if v > 1]
# [1, 3, 2, 5]

因此,您計算每個值的出現次數,然后過濾它的頻率是否超過 1。 OrderedDict繼承意味着保留原始元素的順序。


通過評論,您希望保留所有重復元素,因此您可以預先構建一組重復條目,然后重新迭代您的原始列表,例如:

from collections import Counter

data = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2]
duplicates = {k for k, v in Counter(data).items() if v > 1}
result = [el for el in data if el in duplicates]
# [1, 3, 1, 2, 3, 5, 1, 5, 2]

嘗試這個:

>>> a=[1,2,3,3,4,5,6,6,7,8,9,2,0,0]
>>> a=[i for i in a if a.count(i)>1]
>>> a
[2, 3, 3, 6, 6, 2, 0, 0]
>>> a=[1, 2, 3, 1, 3]
>>> a=[i for i in a if a.count(i)>1]
>>> a
[1, 3, 1, 3]
>>> a=[1, 2, 3, 4, 5]
>>> a=[i for i in a if a.count(i)>1]
a
[]
def checkio(data):
    lis = []
    for i in data:
        if data.count(i)>1:
            lis.append(i)
    print(lis)
checkio([1,2,3,3,2,1])

是的,對這個線程做出貢獻有點晚了,但只是想把它放在網上供其他人使用。

按照您的開始,迭代整數列表,但不計算或刪除元素,嘗試只測試元素是否已經被看到,將其附加到重復元素列表中:

def checkio(data):
    elements = []
    duplicates = []
    for i in data:
        if i not in elements:
            elements.append(i)
        else:
            if i not in duplicates:
                duplicates.append(i)
    return duplicates

d = [1, 3, 1, 2, 3, 5, 8, 1, 5, 2]

print (checkio(d))
#[1, 3, 5, 2]
 numbers = [1, 1, 1, 1, 3, 4, 9, 0, 1, 1, 1]
 x=set(numbers)
 print(x)

您也可以使用set關鍵字來獲得所需的解決方案。

每次在 while 循環中修改列表時,我都使用整數和布爾值來檢查。

rechecks = 1
runscan = True
while runscan == True:
    for i in data:
         if data.count(i) <2:
             data.remove(i)
             rechecks+=1
            #need to double check now
    if rechecks >0:
        runscan = True
        rechecks-=1
    else:
        runscan = False       
return data

生成新列表不是更容易嗎?

def unique_list(lst):
    new_list = []
    for value in lst:
        if value not in new_list:
            new_list.append(value)
    return new_list

lst = [1,2,3,1,4,5,1,6,2,3,7,8,9]
print(unique_list(lst))

打印 [1,2,3,4,5,6,7,8,9]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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