我试图手动创建一个从列表中删除重复项的函数。我知道有一个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日停止。
无论如何要解决这个问题,或者我应该尝试这样做是另一种方式吗?
答案 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}}