猿问

从嵌套类中删除反向重复项 - python

我正在处理从列表中删除重复元素的代码。重复顺序可能不同,但我仍然认为两者相同。


例如,我会考虑[[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]]]

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


呼如林
浏览 115回答 3
3回答

饮歌长啸

要比较两个列表的交集,使用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)

HUX布斯

要比较两个列表的交集,使用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)

四季花海

试试这个:>>> 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 上测试。
随时随地看视频慕课网APP

相关分类

Python
我要回答