创建一个删除列表中重复项的函数

时间:2016-10-26 22:21:16

标签: python list

我试图手动创建一个从列表中删除重复项的函数。我知道有一个Python函数可以做类似的事情(set()),但我想创建自己的函数。这就是我所拥有的:

def remove(lst):

for i in range(len(lst)):
    aux = lst[0:i] + lst[i+1:len(lst)]
    if lst[i] in aux:
        del(lst[i])

return lst

我正在尝试创建一个子列表,其中包含当前打开的项目之外的所有项目,然后检查该项目是否仍在列表中。如果是,请将其删除。

问题是它给了我一个超出范围错误的索引。 for i in range(len(lst)):行每次重新开始都不会更新吗?由于我从列表中删除项目,因此列表将更短,因此对于包含10个项目和2个重复项目的列表,它将上升到索引9而不是在7日停止。

无论如何要解决这个问题,或者我应该尝试这样做是另一种方式吗?

5 个答案:

答案 0 :(得分:1)

我知道这不会修复你当前的脚本,但这会有什么作用吗?

class Example(fooId: Int) {
    val foo: Foo by supplyAsync { Thread.sleep(2000); fooId }
}

fun main(args: Array<String>) {
    val e = Example(123)
    println(e.foo)
}

只是简单地循环,创建另一个列表并检查成员资格?

答案 1 :(得分:0)

问题是你正在迭代它时操纵列表。这意味着当您到达列表的末尾时,它现在更短,因为您删除了元素。您(通常)应该在循环列表时避免删除元素。

答案 2 :(得分:0)

第一次得到它: len(lst)仅在您进入循环时进行评估。如果您想重新评估,请尝试使用 while 版本:

i = 0
while i < len(lst):
    ...
    i += 1

接下来,您会担心另一个问题:当您不删除项目时,只增加 。删除时,缩短列表会转到下一个元素。

i = 0
while i < len(lst):
    aux = lst[0:i] + lst[i+1:len(lst)]
    if lst[i] in aux:
        del(lst[i])
    else:
        i += 1

我认为这应该可以解决你的问题...使用你想要的逻辑。

答案 3 :(得分:0)

def remove(lst):
    new_list = []
    for i in lst:
        if i not in new_list:
            new_list.append(i)
    return new_list

您应该将值附加到辅助列表。作为Bobbyrogers said,迭代正在改变的列表并不是一个好主意。

答案 4 :(得分:0)

你也可以试试这个:

{{1}}