我想創建一個接受串列并回傳相同串列但沒有重復元素的函式
def func(list1):
for i in range(len(list1)):
list2 = [x for x in list1 if x != list1[i]]
if list1[i] in list2:
list1.remove(i)
return list1
mylist = [1,2,3,4]
func(mylist)
uj5u.com熱心網友回復:
你可以這樣做:
def remove_duplicates(l):
return list(set(l))
現在remove_duplicates([1,1,2,3,3,4,5,6,6,7])將回傳[1, 2, 3, 4, 5, 6, 7]。
uj5u.com熱心網友回復:
讓我們假設這個輸入 l = [1,2,3,2,7,3,4,4,7,1]
在不保持順序的情況下洗掉重復項
使用 python集:
list(set(l))
輸出: [1, 2, 3, 4, 7]
維持秩序
使用字典(或collections.Counter)
from collections import Counter
list(Counter(l))
輸出: [1, 2, 3, 7, 4]
uj5u.com熱心網友回復:
使用一組:
mylist = [1,2,3,1,3,2,4]
mylist = set(mylist)
print(mylist)
輸出:
{1, 2, 3, 4}
要保持訂單,您可以執行以下操作:
mylist = list(dict.fromkeys(mylist))
不需要任何庫
uj5u.com熱心網友回復:
在 python 中,我們可以使用 set 來洗掉重復元素:
def removeDuplicates(l):
return list(set(l))
mylist = [1, 2, 3, 4, 2, 3, 4, 2, 3, 4]
newList = removeDuplicates(mylist)
print(newList)
uj5u.com熱心網友回復:
許多答案已經展示了如何正確實作此任務,但沒有討論您的實際代碼。
解構你的代碼
希望這將有助于理解為什么您的代碼不起作用。這是您的代碼,并添加了注釋:
def func(list1):
for i in range(len(list1)):
list2 = [x for x in list1 if x != list1[i]]
在這里,您構造了一個list2不包含的串列list1[i]。
if list1[i] in list2:
if通過構造 ,這個陳述總是會是錯誤的list2。
list1.remove(i)
即使您修復了if陳述句的邏輯,list1.remove(i)也會引起麻煩:嘗試在迭代串列時洗掉串列的元素會使迭代的其余部分的索引無效。最好避免這樣做,而是將結果構建到新串列中。
此外,list1.remove(i)正在尋找價值i的list1,并會洗掉它,無論它首先找到它。它沒有洗掉第 i 個元素,正如這段代碼所期望的那樣。
return list1
而且這個 return 陳述句可能并不意味著縮進這么深,它應該可能for與頂部的陳述句處于同一級別。
作業代碼更接近你的邏輯
雖然我認為這不是最好的解決方案——其他答案提供了更好的解決方案——但這是一個從您的代碼中獲得靈感的解決方案,它有效。
def func(list1):
list2 = [] # We'll append elements here
for item in list1: # more pythonic way to loop over a list
if item not in list2:
list2.append(item)
return list2
我的首選解決方案
好的,所以現在我在其他答案中復制資訊,但是使用 Python 3.6 或更高版本,在其中dict保持插入元素的順序,我會使用 @Pedro Maia 的解決方案:
def func(list1):
return list(dict.fromkeys(list1))
在舊版本的 Python 中,dicts 沒有排序,所以你必須選擇另一個解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/344633.html
下一篇:如何訪問這些表單值?
