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

时间:2015-04-15 07:36:37

标签: 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.remove(same)

        return num1,num2

调用print (del_same_elements([3,11],[2,2,3]))按预期返回[11],[2,2],但在尝试print (del_same_elements([3],[2,2]))时,我收到错误local variable 'same' referenced before assignment。如何处理没有相同值的情况?

4 个答案:

答案 0 :(得分:3)

使用set intersection检测公共元素:

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

答案 1 :(得分:2)

使用一些集理论并计算列表的交集,然后删除项目交集

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]

在没有交叉点的情况下,这也很有效,因为什么都不会被删除

答案 2 :(得分:1)

或者,你可以写这样的程序

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]))

这可以是更好的解决方案。

答案 3 :(得分:0)

或者,你可以改用套装:

same = set(num1) & set(num2)

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

至少避免那些嵌套循环。