2016-03-01 184 views
0

我想寫一個函數remove_duplicates來從列表輸入中只返回唯一值。我試圖想出一些代碼,但它是拋出無限循環錯誤。我無法理解爲什麼。我的目標不是實現結果,因爲我發現有像'SET'這樣的直接方法可以做到這一點。但是,我主要想要理解我的錯誤,因爲這是我的第一語言,也是第一天的任何編碼。從列表中刪除重複項的功能Python

def remove_duplicates(x): 
    z = [x[0]] 
    for i in range(1,len(x)): 
     y = i-1 
     k = 0 
     while y >= 0: 
      if x[i] == x[y]: 
       k = k + 1 
       y -= 1 
     else: 
      break 
     if k == 0: 
      z.append(x[i]) 
    return z   
+1

如果不是'X [I] == X [Y]:'你永遠不會減少'y'並陷入循環。 –

+0

任何特定的原因,你不只是使用'in'或'set'來擺脫重複? –

+0

是的,我試圖通過從頭開始編寫函數來理解循環。對於我來說,概念對我來說更重要,而不是虛擬的結果。感謝您的幫助。 –

回答

5

使用內置的python設置功能。

y = list(set(x)) 

y將是x的唯一元素的列表。這適用於x中的元素可能在一個集合中使用,因此他們必須實現__eq__()__hash__()

3

這將是很好的,如果你可以使用

SET操作

以從列表中刪除重複的元素,像這樣:

my_list = [1, 2, 3, 1, 1, 1, 1, 1, 2, 3, 4] 

現在時間刪除來自此列表的重複元素:

list(set(my_list)) 

Answer: [1, 2, 3, 4] 
+0

現在試試這個去減弱列表'[4,3,2,1]'。或列表的列表。 –

1

的主要問題與您的代碼似乎是在這裏:

while y >= 0: 
    if x[i] == x[y]: 
     k = k + 1 
     y -= 1 

在這裏,你遞減y只有當前元素是比賽,否則你會進入一個無限循環。此外,您必須刪除else: break,否則您的加法循環將在列表中的第一個唯一元素(即第一個元素之後)之後停止。

如果您想保持真實的初始方法,您可以嘗試這樣的:

def remove_duplicates(x): 
    z = [x[0]] 
    for i in range(1,len(x)): 
     for y in range(0, i): 
      if x[i] == x[y]: 
       break 
     else: 
      z.append(x[i]) 
    return z   

但是請注意,有很多簡單方法,以確保這些元素都是唯一的。例如,您可以使用in來檢查當前元素是否已經在結果列表中,而不是單獨檢查每個元素。

def remove_duplicates(lst): 
    res = [] 
    for x in lst: 
     if x not in res: 
      res.append(x) 
    return res 

如果元素保證是哈希的,你也可以使用一個set。但不要做return list(set(lst)),因爲這不會保留列表中元素的順序。這是多一點的話,但比使用x not in res更快。

def remove_duplicates(lst): 
    seen = set() 
    res = [] 
    for x in lst: 
     if x not in seen: 
      res.append(x) 
      seen.add(x) 
    return res 

如果你想要一個班輪這樣,你可以使用OrderedDict雖然:

import collections 
def remove_duplicates(lst): 
    return collections.OrderedDict(zip(lst, lst)).values()