Python-从另一个lis中删除一组列表

2024-04-25 03:52:36 发布

您现在位置:Python中文网/ 问答频道 /正文

array1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array2 = [1, 2, 2, 2, 5, 6, 6, 6, 9]

temp = set(array2)

array1.remove(temp)

Traceback (most recent call last):
  File "Sudoku V2.py", line 6, in <module>
    array1.remove(temp)
ValueError: list.remove(x): x not in list

Tags: inmostcalltempremovelistv2file
3条回答

你要一排一排的吗?

set1=设置(array1)

set2=设置(array2)

差异(set2)是你想要的。

如果你不关心结果中元素的顺序,或者不关心重复的元素,set.difference,正如斯卡·洛佩斯的回答,正是你想要的。

如果您关心顺序并保留重复项,最简单的方法是创建一个新列表,过滤掉array2中的列表:

set2 = set(array2)
array1 = [item for item in array1 if item not in set2]

如果您需要就地破坏性地修改array1,而不是构建新的array1,那么几乎总是更简单地一次全部破坏性地替换array1的内容:

array1[:] = [item for item in array1 if item not in set2]

如果您真的想逐个元素地修改它,最好的方法是向后迭代array1,删除:

set2 = set(array2)
for i, value in enumerate(array1)[::-1]:
    if value in set2:
        del array1[i]

最后,您可以按照flornqueke建议的方式来做,但这需要二次时间而不是线性时间,因为它不利用set;对于set2中的每个元素,它都执行线性的array1.remove

试试这个:

array1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
array2 = [1, 2, 2, 2, 5, 6, 6, 6, 9]
set(array1).difference(array2)
=> set([3, 4, 7, 8])

上面使用集合的difference()方法,该方法返回一个新集合,集合中的元素不在作为参数接收的iterable中。请注意,不需要将array2转换为一个集合就可以工作。

还要注意,通过使用set,所有重复的元素都将被删除,iterables的原始顺序不一定会被保留。如果这是一个问题,请尝试以下替代解决方案:

[x for x in array1 if x not in array2]
=> [3, 4, 7, 8]

相关问题 更多 >