2016-03-01 186 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()