无法创建正确的集/列表

时间:2015-07-24 05:11:03

标签: python list set

我有两个列表

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而我只留下了所有元素的一个副本。

但我的问题是我希望不应删除重复的元素。

怎么办?

4 个答案:

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