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

6 回答 6

28

尝试这个:

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(s) 中。请注意,无需转换array2为集合即可使用。

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

[x for x in array1 if x not in array2]
=> [3, 4, 7, 8]
于 2013-09-16T02:27:15.873 回答
7

如果您不关心结果中元素的顺序,或者不关心重复的元素,set.difference就像 Óscar Ló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.

于 2013-09-16T02:46:15.980 回答
1

你想要array1 - array2吗?

集 1 = 集(数组 1)

集 2 = 集(数组 2)

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

于 2013-09-16T02:30:17.163 回答
0

s -> 序列

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 中的所有元素都是整数。

于 2013-09-16T02:31:50.413 回答
0

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

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

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

于 2013-09-16T02:33:03.593 回答
0

这是可以帮助您解决问题的三个解决方案:

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


array = [i for i in array1 if i not in array2]
print(array)


o = list(set(array1) - set(array2))
print(o)

from collections import OrderedDict

p = OrderedDict() 
p['array'] = list(set(array1) - set(array2))
print(*p.values())
于 2021-11-29T18:18:17.393 回答