用于从List中删除重复项的功能蟒蛇

时间:2016-03-01 19:05:36

标签: python

我正在尝试编写函数remove_duplicates以仅返回列表输入中的唯一值。我试图提出一些代码,但它抛出无限循环错误。我无法理解为什么。目标不是达到结果,因为我发现有直接的方法,如' SET'去做这个。但是,我主要想了解我的错误,因为这是我的第一语言,也是任何编码的第一天。

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        

3 个答案:

答案 0 :(得分:17)

使用内置的python集功能。

y = list(set(x))

y将是x的唯一元素列表。这可以在x中的元素可以在集合中使用时使用,因此它们必须实现__eq__()__hash__()

答案 1 :(得分:4)

如果你能使用

,它会很好
  

SET运算符

从列表中删除重复的元素,如下所示:

.directive('mdInputContainer', mdInputContainer);

function mdInputContainer() {
    return {
        restrict: 'E',
        require: 'mdInputContainer',
        link: link
    };

    //////////////////////////////////////////////////////////////////

    function link(scope, element, attrs, mdInputContainerCtrl) {
        element.on('click', function () {
            mdInputContainerCtrl.delegateClick();
        });
    }
}

现在是时候从这个列表中删除重复的元素了:

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

答案 2 :(得分:3)

您的代码的主要问题似乎在这里:

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()