我有两个列表
a = [1,1,2,3]
b = [1,2]
我需要一个新的列表c来获得通过从列表a中删除列表b的公共元素而得到的答案。这意味着如果b有1,2然后从新列表中删除后应该有1,3作为元素。
[1,3]
我试过
d = set(a) & set(b)
c = set(a) - d
print c
但我得到了
[3]
而不是
[1,3]
我知道这是因为我设置的那一刻(a)重复的元素是trucncated而我只留下了所有元素的一个副本。
但我的问题是我希望不应删除重复的元素。
怎么办?
答案 0 :(得分:2)
您可以使用collections.Counter
-
>>> a = [1,1,2,3]
>>> b = [1,2]
>>> from collections import Counter
>>> c = list((Counter(a) - Counter(b)).elements())
>>> c
[1, 3]
这样做会对列表a
中的元素进行计数,然后在列表b
中计算,然后通过列表中类似元素的计数减少列表a
中的计数b
,并将其转换回列表并存储在c
。
如果b
的元素不在a
,示例 -
>>> a = [1,1,2,3]
>>> b = [1,2,4]
>>> list((Counter(a) - Counter(b)).elements())
[1, 3]
答案 1 :(得分:1)
您不需要套装和其他套餐。在资源方面,导入额外的包“可能”很昂贵。
试试这个。
c = list(a)
for data in b:
if data in c:
c.remove(data)
要忽略,您可以使用try-except block。
c = list(a)
for data in b:
try:
c.remove(data)
except ValueError:
pass
答案 2 :(得分:0)
您可以使用remove()
删除一个匹配项和一个循环。例如:
a = [1,1,2,3]
b = [1,2]
# Create a copy of a so you don't modify a itself
c = list(a)
for num in b:
c.remove(num)
print c
答案 3 :(得分:0)
Counter
对此很方便,但它的声誉很慢。
以下是使用defaultdict
的版本。
>>> from collections import defaultdict
>>> D = defaultdict(int)
>>> a = [1,1,2,3]
>>> b = [1,2]
>>> for k in a:
... D[k] += 1
...
>>> for k in b:
... D[k] -= 1
...
>>> [k for k in D for i in range(D[k])]
[1, 3]
以下是另一种在结果
中保留a
顺序的方法
>>> D = defaultdict(int)
>>> a = [1,1,2,3]
>>> b = [1,2]
>>> for k in b:
... D[k] += 1
...
>>> res = []
>>> for i in a:
... if D[i]:
... D[i] -= 1
... else:
... res.append(i)
...
>>> res
[1, 3]