Python,如何从列表A中删除列表B以生成列表C?

5
如何将一个列表中的另一个列表剔除出来,生成一个新的列表呢?比如从列表a中减去列表b,得到新的列表c。
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9,]

b = [3, 4, 5, 6]

c = []?

8
这个问题表述不够明确。当你说 [0,1,1] - [1] 时,你希望得到的结果是 [0] 还是 [0,1]? 当你说 [0,1,2] - [0,2] 时,你希望得到的结果是 [1] 还是 [0,1,2] (因为 [0,2] 不是一个连续子序列)?等等。 - DSM
4个回答

12
将列表转换为集合并取集合差异。
c = list(set(a).difference(set(b))

2
与列表推导式不同,这种方法不会保留a中的顺序或任何重复元素。 - Kos
为什么不用 list(set(a) - set(b)) - thebjorn
它具有相同的目的,但方法调用更加明确。 - Makoto
1
末尾缺少一个 ),但不能只为添加一个字符而进行编辑。 - Rayanth

7
为了保持排序并从使用集合成员获得加速:

bs = set(b)
c = [x for x in a if x not in bs]

2
这样做可能会更慢,因为 set(b) 每次测试 if 时都会重新构建。 - DSM
2
在LC之前将set(b)存储在一个变量中。 - Ashwini Chaudhary

5

或者使用列表推导式:

c = [x for x in a if x not in b]

2

根据你的需求,使用集合可能更为合适:

>>> a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }
>>> b = {3, 4, 5, 6}
>>> a
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b
set([3, 4, 5, 6])
>>> a.difference(b)
set([0, 1, 2, 7, 8, 9])

collections.Counter 是另一个有用的标准类型,如果你想要计算多次重复出现的次数:

>>> from collections import Counter as C
>>> a = C([1,1,1,2,2,3,4])
>>> b = C([1,4,5])
>>> a - b
Counter({1: 2, 2: 2, 3: 1})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接