逻辑只能起一半作用,但不能完全起作用

2024-04-20 05:05:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从排序列表中删除重复项。你知道吗

nums = [0,0,1,1,1,2,2,3,3,4]

for i in range(len(nums)):
   a = nums.count(i)
   if(a>1):
      nums.pop(i)

我得到了[0, 1, 2, 3, 3, 4],但我期待着[0, 1, 2, 3, 4]。你知道吗

我看到我使用的逻辑工作了一半,删除了重复项,直到值2,但由于某种原因,我不明白它不适用于值3。你知道吗


Tags: in列表forlenif排序countrange
3条回答

你的逻辑在这里行不通。由于您正在循环遍历列表中的项数,并且列表的长度正在更改,因此您有可能遇到错误(IndexError)。你知道吗

这是解决这个问题的另一种方法。你知道吗

nums = [0,0,1,1,1,2,2,3,3,4]
new_list = []

for i in range(len(nums)):
   num = nums[i]
   if num not in new_list:
       new_list.append(num)

print(new_list)
nums = [0,0,1,1,1,2,2,3,3,4]

seen_n = set()
for i, n in reversed(list(enumerate(nums))):
    if n in seen_n:
        del nums[i]
    else:
        seen_n.add(n)
print(nums)

印刷品:

[0, 1, 2, 3, 4]

如果要按索引号迭代元素,则需要按相反顺序删除元素,以便访问的下一个元素的索引不受删除前一个元素的影响。在这段代码中,我们只需跟踪在一个集合中看到的每个唯一值,并根据该集合中的成员身份测试列表中的每个元素,看看是否应该删除它。你知道吗

我只想补充一点,有很多方法可以解决这个问题。但提出的问题是,“从列表中删除重复项”。我从字面上理解这一点,并不认为创建第二个删除重复项的列表与从原始列表中删除重复项是一回事。你必须扪心自问,如果原来的清单上还有其他的参考资料呢?他们会看到变化吗?没有

您的问题在于您对nums.pop(i)的误解:它不会删除所有i项,它只会删除具有索引i的单个项。你知道吗

因此nums.pop(3)删除第二个2项。你知道吗

# [0,0,1,1,1,2,2,3,3,4]
# [  0,1,1,1,2,2,3,3,4]
# [  0,  1,1,2,2,3,3,4]
# [  0,  1,  2,2,3,3,4]
# [  0,  1,  2,  3,3,4]

相关问题 更多 >