Why I get the list unchanged when using this code?
我希望使用此结构来延迟列表中的重复元素,但使用此代码时列表保持不变。有人能帮我吗?
例如,item=[1,2,3,4,5,6,7,8,9,1,2,6,7]
1 2 3 4 5 6 7 8 9 10 | def duplicated(item): i=0 j=0 while i<len(item): while j<len(item): if item[j]==item[i] and i!=j: del item[j] j+=1 i+=1 return item |
为了解决代码不工作的原因,这是因为您在函数开始时初始化了
这意味着你错过了许多副本。
所以,既然我们需要在每个循环中初始化它,我们仍然需要知道该怎么做。如果我们将其初始化为
最后一件事是,当使用
所以,在代码中:
1 2 3 4 5 6 7 8 9 10 11 | def duplicated(item): i = 0 while i < len(item): j = i + 1 while j < len(item): if item[j] == item[i]: del item[j] j -= 1 j += 1 i += 1 return item |
它与人们给出的例子一起工作:
1 2 3 4 | >>> duplicated([1,2,3,4,5,6,7,8,9,1,2,6,7]) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> duplicated([1,2,3,4,5,6,7,8,9,1,1,2,6,7]) [1, 2, 3, 4, 5, 6, 7, 8, 9] |
。
但是,由于我们使用的是嵌套循环,所以所用的时间与输入列表的平方大小成正比,因此该解决方案是目前的
但是,如果我们能够将算法修改为只使用一个循环,我们将把复杂性降低到
因此,如果我们有一个集合包含我们已经看到的元素,那么对于每个未来的元素,如果它已经在
所以,在代码中:
1 2 3 4 5 6 7 8 9 10 | def duplicated(item): seen = set() i = 0 while i < len(item): if item[i] in seen: del item[i] else: seen.add(item[i]) i += 1 return item |
我可以确认这也通过了上面的测试用例。
我要指出的最后一点是,在这里删除元素时,我没有从指针中减去,这是因为在我们减去之前,我们知道它稍后会增加,我们希望它是相同的,但是在这里,它只在
实际上,变量
1 2 3 4 5 6 7 8 9 10 11 | def duplicated(item): i=0 while i<len(item): j = i+1 while j<len(item): if item[j]==item[i] and i!=j: del item[j] j -= 1 j+=1 i+=1 return item |
。
每次嵌套while循环开始时需要重新初始化j:
1 2 3 4 5 6 7 8 9 10 11 12 | def duplicated(item): i=0 j=0 while i<len(item)-1: j=i+1 while j<len(item): if item[j]==item[i]: del item[j] j -= 1 j+=1 i+=1 return item |
。出
1 | [1, 2, 3, 4, 5, 6, 7, 8, 9] |
。
但是,您可以尝试以下更简单的代码,它将保持列表的插入顺序
1 2 3 4 5 6 | def duplicated(item): unique_list=[] for i in item: if i not in unique_list: unique_list.append(i) return unique_list |
你应该在
1 2 3 4 5 6 7 8 9 10 11 | def duplicated(item): i=0 while i<len(item): j=0 while j<len(item): if item[j]==item[i] and i!=j: print(i,j ) del item[j] j+=1 i+=1 return item |
但是,如果不关心列表顺序,最好的方法可能是将列表转换为一个集合,然后再转换回一个列表,有一个集合只能有不同的元素。
1 2 | def duplicated(item): return list(set(item)) |
号