【发布时间】:2020-06-08 15:13:03
【问题描述】:
我有两个列表:
A = [5,5,4,3]
B = [5,1]
我想删除出现在两个列表中的值,但只删除一次,即输出应该是:
Aprime = [5,4,3]
Bprime = [1]
我知道使用sets 是一种获得差异的好方法,但这会删除所有重复,而不仅仅是一次
【问题讨论】:
标签: python python-3.x list set
我有两个列表:
A = [5,5,4,3]
B = [5,1]
我想删除出现在两个列表中的值,但只删除一次,即输出应该是:
Aprime = [5,4,3]
Bprime = [1]
我知道使用sets 是一种获得差异的好方法,但这会删除所有重复,而不仅仅是一次
【问题讨论】:
标签: python python-3.x list set
您可以使用输入列表创建collections.Counter对象并获取两者的差异:
from collections import Counter
a = Counter(A)
b = Counter(B)
Aprime = list((a - b).elements()) # Aprime becomes: [5, 4, 3]
Bprime = list((b - a).elements()) # Bprime becomes: [1]
【讨论】:
A = B = [1,1] 怎么办?这将返回两个空列表,这意味着1 被多次删除。
使用集合查找重复项,然后将它们从原始列表中删除一次。
dups = set(A).intersection(set(B))
for dup in dups:
A.remove(dup)
B.remove(dup)
【讨论】:
您可以使用这两个列表的集合从与 A 和 B 关联的每个计数器中删除 Counter 构建,以便它们只被考虑一次。
>>> A = [5,5,5,1,1]
>>> B = [5,1,1]
>>> a_new = list((Counter(A) - Counter(set(B))).elements())
>>> b_new = list((Counter(B) - Counter(set(A))).elements())
>>> a_new
[5, 5, 1]
>>> b_new
[1]
【讨论】: