在python中从两个列表中删除相同的元素

在python中从两个列表中删除相同的元素,python,Python,我正在编写一个函数来删除两个列表中相同的元素 def del_same_elements(num1,num2): for i in range(0,len(num1)): for j in range(0,len(num2)): if num1[i] == num2[j]: same = num1[i] num1.remove(same) num2

我正在编写一个函数来删除两个列表中相同的元素

 def del_same_elements(num1,num2):
        for i in range(0,len(num1)):
            for j in range(0,len(num2)):

                if num1[i] == num2[j]:
                    same = num1[i]

        num1.remove(same)
        num2.remove(same)

        return num1,num2

调用
print(del_-same_元素([3,11],[2,2,3])
会按预期返回
[11],[2,2]
,但在尝试
print(del_-same_元素([3],[2,2])时,
我得到了赋值前引用的错误
局部变量'same'。如何处理没有相同值的情况?

或者,您可以编写这样的程序

def del_same_elements(num1,num2):
    for num in num1 + num2:
        if num in num1 and num in num2:
            num1.remove(num)
            num2.remove(num)

    return num1, num2

print (del_same_elements([3,11],[2,2, 3]))

这可能是一个更好的解决方案。

或者,您也可以编写这样的程序

def del_same_elements(num1,num2):
    for num in num1 + num2:
        if num in num1 and num in num2:
            num1.remove(num)
            num2.remove(num)

    return num1, num2

print (del_same_elements([3,11],[2,2, 3]))

这可能是一个更好的解决方案。

使用一点集合论,计算列表的交集,然后删除交集项

def del_same_elements(num1, num2):
    same = list(set(num1) & set(num2))

    for i in same:
        num1.remove(i)
        num2.remove(i)

    return num1, num2

if __name__ == "__main__":
    num1, num2 = del_same_elements([1,2,3,4,5], [1,3,5,6])

print num1
print num2
结果

[2, 4]
[6]

在没有交集的情况下,这也非常有效,因为不会删除任何内容

使用一点集合论,计算列表的交集,然后删除交集项

def del_same_elements(num1, num2):
    same = list(set(num1) & set(num2))

    for i in same:
        num1.remove(i)
        num2.remove(i)

    return num1, num2

if __name__ == "__main__":
    num1, num2 = del_same_elements([1,2,3,4,5], [1,3,5,6])

print num1
print num2
结果

[2, 4]
[6]

在没有交叉点的情况下,这也非常有效,因为使用set
交叉点检测公共元素时,不会删除任何内容:

def rm_same(num1, num2):
    same = set(num1).intersection(num2)
    for s in same:
        num1.remove(s)
        num2.remove(s)
    return num1, num2

使用set
交叉点
检测公共元素:

def rm_same(num1, num2):
    same = set(num1).intersection(num2)
    for s in same:
        num1.remove(s)
        num2.remove(s)
    return num1, num2

或者,您可以使用集合:

same = set(num1) & set(num2)

while same:
    val = same.pop()
    num1.remove(val)
    num2.remove(val)

这至少避免了那些嵌套循环。

或者,您可以使用集合来代替:

same = set(num1) & set(num2)

while same:
    val = same.pop()
    num1.remove(val)
    num2.remove(val)


这至少避免了那些嵌套循环。

调用print(del_same_元素([3,11],[2,2])按预期返回[11],[2,2]。
这是怎么可能的?两个列表中没有共同的元素?我打错了!我会编辑。如果您有列表
[2]
[2,2]
,您希望得到两个空列表,还是第二个仍然有一个
2
?另外,列表修改是否合适(或特别不合适)?我希望[]和[2]。请详细描述并使用更多示例说明您正在尝试执行的操作。
调用print(del_same_元素([3,11],[2,2])会按预期返回[11],[2,2]
这是如何实现的?两个列表中没有共同的元素?我打错了!我会编辑。如果您有列表
[2]
[2,2]
,您希望得到两个空列表,还是第二个仍然有一个
2
?此外,列表修改是否合适(或特别不合适)?我希望[]和[2]。请使用更多示例详细描述您正在尝试执行的操作。您并不真正需要
if
,因为在空列表中循环不会执行块。您也不需要将集合转换为列表:)编辑以避免不必要的操作:)您不真正需要
if
,因为在空列表中循环将不执行该块。您也不需要将集合转换为列表:)编辑以避免不必要的操作:)这太完美了!我从没想过这个。这太完美了!我从来没有想到过这一点。很抱歉在制定一套解决方案时太慢了!抱歉在生成一套解决方案时太慢!