【问题标题】:Remove duplicate of a list via list matching in Python [duplicate]通过 Python 中的列表匹配删除列表的重复项 [重复]
【发布时间】:2023-02-13 23:53:37
【问题描述】:

我选择了一个稍微不同的程序来删除列表的重复项。我想并行保留一个新列表,其中添加了每个重复项。然后我检查该元素是否存在于“新创建的列表”中以便删除它。

代码如下所示:

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

t = []
nums_new = nums
for i in nums:
    if nums[i] not in t:
        t.append(nums[i])
    else:
        nums_new.remove(nums[i])
nums = nums_new
print(nums)

对于 nums = [1,1,2] 的情况,这工作正常并返回 [1,2]
但是,对于 nums = [0,0,1,1,1,2,2,3,3,4],这种情况似乎不起作用,因为我得到以下输出:[0, 1, 2, 2, 3, 3, 4]

为什么是这样?有人可以向我解释这些步骤吗?

【问题讨论】:

  • for i in nums 使 i 成为 nums 的元素,而不是索引。所以你应该使用 i 而不是 nums[i]
  • @SembeiNorimaki 如果我这样做,我仍然会以某种方式得到不正确的列表...
  • 请使用更新的代码、您正在使用的输入列表和您得到的结果编辑您的问题
  • 有没有动机不做nums = list(set(nums))?请注意,在迭代时从列表中删除元素充满了危险。
  • 如果你没有选择所有元素都是有效索引的测试用例,例如 nums = ['1', '1', '2']...(你想做的不只是给你留下两个相同的列表吗?)

标签: python


【解决方案1】:

您的代码有两个问题:

  1. 因为你是iterating over a listfor i in numsi是你的实际号码,不是索引器,所以你应该只使用i而不是nums[i]

  2. nums_new = nums实际上不会复制nums,而是复制make a second binding to the very same list。所以你应该写 nums_new = nums.copy() 以避免在迭代时更改你的原始列表。

    通过这两项更改,您的代码可以按您的意愿工作:

    nums = [0,0,1,1,1,2,2,3,3,4]
    
    t = []
    nums_new = nums.copy()
    for i in nums:
        if i not in t:
            t.append(i)
        else:
            nums_new.remove(i)
    
    nums = nums_new
    
    print(nums)
    

    返回[0,1,2,3,4]

    当然这是某种学术练习,但请注意 remove duplicates from a list is 的 Pythonic 方式:

    • list(dict.fromkeys(nums)) 如果你想保留订单,和
    • list(set(nums)) 如果您不关心顺序,可以使用稍微快一点的方法。

【讨论】:

  • 我也知道这种方法,但我的用例是这样的,我不得不选择这种方法。但我一定是忘记了.copy()。感谢您的解释!
猜你喜欢
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
相关资源
最近更新 更多