Python从另一个字符串列表中减去字符串列表

Python从另一个字符串列表中减去字符串列表,python,string,list,list-comprehension,Python,String,List,List Comprehension,我想减去一个字符串列表,其中有多个相同元素(因此集合操作没有用处) 例如: C = ['A','B','B'] D = ['B'] 我想要一种方法来做到这一点: C - D = ['A','B'] 到目前为止,我得到的例子,但没有给出我想要的结果 [item for item in C if item not in D] returns: ['A'] 下面是一个更详细的示例来说明我想要什么: 这就是我想要的结果: C - D = ['A', 'A', 'B', 'B','B','X']

我想减去一个字符串列表,其中有多个相同元素(因此集合操作没有用处)

例如:

C = ['A','B','B']
D = ['B']
我想要一种方法来做到这一点:

C - D = ['A','B']
到目前为止,我得到的例子,但没有给出我想要的结果

[item for item in C if item not in D]
returns: ['A']
下面是一个更详细的示例来说明我想要什么:

这就是我想要的结果:

C - D = ['A', 'A', 'B', 'B','B','X']

您可以使用集合中的计数器:

from collections import Counter
C_D = [i for v,c in (Counter(C)-Counter(D)).items() for i in v*c] 

不使用任何库:

output = [x for x in C if not x in D or D.remove(x)]

//output: ['A', 'B']

虽然Alain T.的方法还可以,但有一种更好的方法使用
计数器

from collections import Counter
C = ['A','B','B']
D = ['B']
result = list((Counter(C) - Counter(D)).elements())
您可以尝试以下方法:

C = ['A','B', 'A','A','B','B','B','X','B']
D = ['A','B','B','Y']

res = [ i for i in C ]

for i in D:
  if i in C:
    res.remove(i)

print(res)

可能重复聪明地使用remove()的None return()+1这种方式似乎会以某种方式改变结果——如果我多次运行它,它会在结果中添加一个额外的B。不确定会发生什么,但有些事情并没有按照我的预期或希望的那样进行。当我们使用列表理解时,上面的解决方案是有效的(确保有D.remove(x)检查)。然而,当我们在没有列表理解的情况下实现相同的逻辑时,我很困惑地看到它是如何产生完全不同的结果的。当我们从中移除D,移除(x)以得到预期的答案时,也很麻烦。我猜这与列表理解中的“或”操作符实现有关。现在是凌晨2:30,我明天早上会挖得更深。我会接受“阿兰”It’这是一天中的任何时候。
C = ['A','B', 'A','A','B','B','B','X','B']
D = ['A','B','B','Y']

res = [ i for i in C ]

for i in D:
  if i in C:
    res.remove(i)

print(res)