在python中从另一个列表中减去一个列表,其中可能出现重复值

时间:2019-05-01 09:09:47

标签: python list

我希望从另一个数组中删除一个数组的内容。

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']

什么是实现此目标的好方法?

5 个答案:

答案 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)