簡體   English   中英

從列表python中刪除重復項

[英]Remove duplicates from list python

我正在嘗試編寫一個從列表中刪除重復項的程序,但是if n/(sequence[k]) == 1: :,我的程序會在第5行繼續拋出錯誤“list index out of range”。 我無法弄清楚這一點。 我是否正確地認為“k”的可能值是0,1和2? 如何將“序列”作為可能索引范圍之外的索引?

def remove_duplicates(sequence):
    new_list = sequence
    for n in sequence:
        for k in range(len(sequence)):
            if n/(sequence[k]) == 1:
                new_list.remove(sequence[k])
    print new_list

remove_duplicates([1,2,3])

您的錯誤是並發修改列表:

for k in range(len(sequence)):
    if n/(sequence[k]) == 1:
        new_list.remove(sequence[k])

可能看起來從new_list中刪除不應該影響序列,但是你在函數的開頭做了new_list = sequence 這意味着new_list實際上字面上是序列,也許你的意思是new_list=list(sequence) ,復制列表?

如果您接受它們是相同的列表,則錯誤是顯而易見的。 刪除項目時,長度和索引會更改。

PS正如@Akavall在評論中所提到的,您所需要的只是:

sequence=list(set(sequence))

使序列不包含欺騙。 如果您需要保留訂購,另一個選擇是:

from collections import OrderedDict
sequence=list(OrderedDict.fromkeys(sequence))

我強烈建議Akavall回答:

list(set(your_list))

至於你為什么超出范圍錯誤:Python通過引用傳遞,即序列和new_list仍然指向相同的內存位置。 更改new_list也會改變順序。

最后,您要將項目與自己進行比較,然后將其刪除。 所以基本上即使您使用了序列的副本,例如:

new_list = list(sequence)

要么

new_list = sequence[:]

它會返回一個空列表。

如果你不喜歡list(set(your_list))因為它不能保證保存順序,你可以獲取OrderedSet配方 ,然后執行:

from ordered_set import OrderedSet

foo = list("face a dead cabbage")
print foo
print list(set(foo)) # Order might change
print list(OrderedSet(foo)) # Order preserved
# like @Akavall suggested
def remove_duplicates(sequence):
    # returns unsorted unique list
    return list(set(sequence))

# create a list, if ele from input not in that list, append.
def remove_duplicates(sequence):
    lst = []
    for i in sequence:
        if i not in lst:
            lst.append(i)
    # returns unsorted unique list
    return lst

暫無
暫無

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

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