使用这些列表:
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)
使用这些列表:
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)
@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)
您可以为此目的使用集合操作:
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)