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

时间:2013-09-16 02:24:39

标签: python list set

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

5 个答案:

答案 0 :(得分:20)

试试这个:

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()方法,它返回一个新集合,其中集合中的元素不在作为参数接收的可迭代中。请注意,无需将array2转换为集合即可生效。

另请注意,通过使用集合,将删除所有重复元素,并且不一定会保留迭代的原始顺序。如果这是一个问题,请尝试以下替代解决方案:

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

答案 1 :(得分:4)

如果您不关心结果中元素的顺序,或关于重复元素,set.difference,如ÓscarLópez的答案,正是您想要的。

如果你关心订单并保留重复项,最简单的方法就是建立一个新列表,过滤掉array2中的列表:

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

如果你需要在原地破坏性地修改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]

最后,可以按照flornquake建议的方式进行,但这需要二次时间而不是线性时间,因为它不会影响set;对于set2中的每个元素,它都是线性array1.remove

答案 2 :(得分:0)

你想要array1 - array2吗?

set1 = set(array1)

set2 = set(array2)

set1.difference(set2)就是你想要的。

答案 3 :(得分:0)

s - &gt;序列

s.remove(x) remove the first item from s where s[i] == x

remove raises ValueError when x is not found in s.

http://docs.python.org/3/library/stdtypes.html#index-23

array1中的所有元素都不是一个集合。 array1中的所有元素都是整数。

答案 4 :(得分:0)

remove()方法接受列表中的单个元素,因此我们必须为每个元素调用一次:

for item in set(array2):
    array1.remove(item)

其他方法,如Óscar's和abanert's更好,但它们更惯用,效率更高。