0

使用这些列表:

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

2 回答 2

2

@gokcehan 的答案中保留顺序的算法是立方体O(n**3)。即使对于中等大小的列表,它也非常低效(Programming Pearls 书中有一个示例,其中 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)

演示

于 2012-10-14T02:43:21.433 回答
2

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

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)
于 2012-10-13T21:42:11.773 回答