我希望从另一个数组中删除一个数组的内容。
array_2 = ['one' , "two" , "one", "three", "four"]
array_1 = ['one', "two"]
我的第一个想法是使用列表comprehensions
array_3 = [x for x in array_2 if x not in array_1]
但是,这将删除重复的项目
结果:['three', 'four']
我要从列表中删除一次"one"
,因为我正在寻找列表减法。所以我希望结果是:['one', 'three', 'four']
。
什么是实现此目标的好方法?
答案 0 :(得分:2)
尝试Counter
中的collections
:
from collections import Counter
array_2 = ['one' , "two" , "one", "three", "four"]
array_1 = ['one', "two"]
list((Counter(array_2) - Counter(array_1)).elements())
输出
['one', 'three', 'four']
答案 1 :(得分:1)
您可以使用列表的remove
方法:
array_2 = ['one' , "two" , "one", "three", "four"]
array_1 = ['one', "two"]
# copy list
array_3 = array_2[:]
for element in array_1:
try:
array_3.remove(element)
except ValueError:
pass
print(array_3)
# ['one', 'three', 'four']
答案 2 :(得分:0)
Counter
对象对此很完美。
In [1]: from collections import Counter
In [2]: array_2 = ['one' , "two" , "one", "three", "four"]
In [3]: array_1 = ['one', "two"]
In [4]: a2 = Counter(array_2)
In [5]: a1 = Counter(array_1)
In [6]: a2 - a1
Out[6]: Counter({'one': 1, 'three': 1, 'four': 1})
如果需要列表,可以使用以下方法来展平Counter
:
In [7]: list((a2-a1).elements())
Out[7]: ['one', 'three', 'four']
答案 3 :(得分:0)
结合使用map
函数和lambda
将解决您的任务:
map(lambda x: array_2.remove(x) if x in array_2 else None, array_1)
这将直接更改array_2
,结果将是:
print(array_2)
# ['one', 'three', 'four']
答案 4 :(得分:0)
我将收集上面已经给出的出色解决方案。
如果您关心保持array_2
中元素的原始顺序,那么我认为您必须使用remove
:
array_1 = ['one', 'two']
array_2 = ['one', 'two', 'one', 'three', 'four']
array_3 = list(array_2)
for x in array_1:
try:
array_3.remove(x)
except ValueError:
pass
print(array_3)
如果元素的最终顺序是什么都没关系,则使用Counter
会更有效,因为它只循环遍历两个列表一次:
from collections import Counter
array_1 = ['one', 'two']
array_2 = ['one', 'two', 'one', 'three', 'four']
array_3 = list((Counter(array_2) - Counter(array_1)).elements())
print(array_3)