【问题标题】:Removing reverse duplicates from a nested like - python从嵌套的like中删除反向重复项-python
【发布时间】:2020-06-05 05:12:00
【问题描述】:

我正在编写一个从列表中删除重复元素的代码。重复顺序可以不同,但​​我仍然认为两者相同。

例如,我会考虑使用 [[m, b], [c, d]][[c, d], [m, b]] 去重复。

我正在编写一个可以将这些识别为重复的代码,并从整个列表中删除多余的部分。到目前为止,我在一个没有任何重复项的列表上进行了尝试,因此最终列表应该保持不变。

这是列表,

A= [[[a1, b1], [a1, b1]],
 [[a2, b2], [a2, b2]],
 [[a3, b3], [a3, b3]],
 [[a4, b4], [a4, b4]]]

我使用的代码是,

for i in A:
    for j in A:
        if j[1]== i[0]:
            if j[0]==i[1]:
                A.remove(j)

我希望代码将给定内部列表 (j[1]) 中的第二个元素与其他内部列表之一 (i[0]) 中的第一个元素进行比较,对于 j[0] 和 i[1 ],如果它们相等(即 i 和 j 彼此重复),则从列表中删除其中一个元素。

问题在于,使用此代码,输出不应与起始列表 (A) 不同,但结果是这样,

[[[a2, b2], [a2, b2]], [[a4, b4], [a4, b4]]]

我只是在寻找有关为什么会发生这种情况以及如何更改我的代码以避免问题的输入。

【问题讨论】:

  • 在迭代列表时不要从列表中删除项目。
  • 我不确定我是否理解?代码不是要求只删除满足条件的元素吗?
  • 循环条件for i in A 在循环开始时被评估一次。此时,代码“记住”了列表中的所有元素。但是如果你从循环内的列表中删除元素,那么列表的实际状态就会与“记住”的状态不同步,就会发生不好的事情。
  • 您需要一些方法来确保ij 不是同一个项目。例如,在第一次内部循环迭代中,ij 都是 [[a1, b1], [a1, b1]],因为它们是同一个项目,因此该项目被删除。
  • 也许是if i is j: continue ?

标签: python list duplicates


【解决方案1】:

要比较两个列表的交集,使用 sets 会很有帮助,尤其是当您的列表包含两个以上的元素时。

a = ['m', 'n']
b = ['n', 'o']
print(set(a) & set(b)) # The & operator returns the intersecting elements

-> {'n'}

至于你的问题,这段代码应该可以工作:

for a in A:
  B = A.copy()
  B.remove(a) # so you don't compare a to a and mark it as a duplicate
  for b in B:
    if set(b[0]) & set(b[1]):
      A.remove(b)

【讨论】:

  • 嗨,我刚刚检查了一下,它返回: [[['a1', 'b1'], ['a1', 'b1']]] 我认为这不对
【解决方案2】:

我想我明白了:

B = A.copy()
C = A.copy()
for index, element in enumerate(B):
    try:
        if set(B[index][0]) == set(C[index + 1][0]) or set(B[index][1]) == set(C[index + 1][1]):
            A.remove(element)
    except:
        pass

如果是

A = [
    [['a1', 'b1'], ['a1', 'b1']],
    [['a2', 'b2'], ['b2', 'a2']],
    [['a3', 'b3'], ['a3', 'b3']],
    [['a4', 'b4'], ['a4', 'b4']]
]

这会返回 A

如果你有:

A = [
    [['a1', 'b1'], ['a1', 'b1']],
    [['a1', 'b1'], ['b1', 'a1']],
    [['a3', 'b3'], ['a3', 'b3']],
    [['a4', 'b4'], ['a4', 'b4']]
]

返回:

A = [
    [['a1', 'b1'], ['b1', 'a1']],
    [['a3', 'b3'], ['a3', 'b3']],
    [['a4', 'b4'], ['a4', 'b4']]
]

在您的代码中,它不起作用,因为您正在从正在迭代的内容中删除元素。此外,检查列表是否彼此相等不会告诉您它们是否包含相同的元素,即[a,b] == [b,a] 返回False。您需要比较集合。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    试试这个:

    >>> import numpy as np
    >>> def remove_duplicates(A):
    ...     for sublist in A:
    ...             sublist.sort()
    ...     B = []
    ...     for sublist in A:
    ...             if sublist not in B:
    ...                     B.append(sublist)
    ...     return B
    ... 
    >>> A = np.random.randint(low=0, high=3, size=(8, 2)).tolist()
    >>> A
    [[0, 1], [1, 0], [0, 2], [0, 0], [2, 2], [2, 2], [0, 2], [1, 0]]
    >>> remove_duplicates(A)
    [[0, 1], [0, 2], [0, 0], [2, 2]]
    

    在 python 3.7.7 上测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2016-10-19
      • 2021-11-27
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      相关资源
      最近更新 更多