从列表中删除常用元素

时间:2012-10-13 21:35:17

标签: python list python-2.7

使用这些列表:

a=[2,6,79,10]
b=[6,7,2,0,8,5]

所需的输出是:

a=[79,10]
b=[7,0,8,5]

为什么这段代码不起作用?

def cel(a,b):
    for x in a:
        if x in b:
            b.remove(x)
            a.remove(x)

2 个答案:

答案 0 :(得分:2)

您可以为此目的使用set操作:

i = set(a).intersection(set(b))
a = list(set(a).difference(i))
b = list(set(b).difference(i))

编辑我尝试调试原始代码并意识到只要删除一个代码就会跳过一个数字。在谷歌搜索之后,我发现由于一些内部索引问题,在迭代时修改列表不是定义的行为。最简单的解决方法是在for循环中使用原始数组的副本:

for x in a[:]:
    if x in b:
        b.remove(x)
        a.remove(x)

答案 1 :(得分:2)

保存顺序的@ gokcehan答案中的算法是立方O(n**3)。即使对于中等大小的列表,它也是非常低效的(编程珍珠书有一个例子,其中Basic中的线性算法优于C中的立方算法(分钟与天数))。

您可以保留订单并以线性时间运行:

common = set(a).intersection(b)
a = [x for x in a if x not in common]
b = [x for x in b if x not in common]

你可以在现场进行:

def remove_items(lst, items):
    items = set(items) # unnecessary in your case
    pos = 0
    for x in lst:
        if x not in items:
           lst[pos] = x # save
           pos += 1
    del lst[pos:]

common = set(a).intersection(b)
remove_items(a, common)
remove_items(b, common)

demo