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