我想删除出现在 a 和 b 中的元素(不是所有出现的元素)
a = [[2.0, 3.0], [1.0, 2.0] , [2.0, 3.0]]
b = [[1.0, 4.0], [2.0, 3.0] , [3.0, 4.0]]
预期输出
c = [[1.0, 2.0], [2.0, 3.0], [1.0, 4.0], [3.0, 4.0]]
如果一个点在 a 中出现两次,在 b 中出现两次,那么输出应该包含该点两次
a = [[2.0, 3.0], [1.0, 2.0] , [2.0, 3.0]]
b = [[1.0, 4.0], [2.0, 3.0] , [3.0, 4.0], [2.0, 3.0]]
预期输出
c = [[1.0, 2.0], [2.0, 3.0], [1.0, 4.0], [3.0, 4.0], [2.0, 3.0]]
我试过了
first_set = set(map(tuple, a))
secnd_set = set(map(tuple, b))
first_set.symmetric_difference(secnd_set)
但这考虑了 a 或 b 中的元素本身。
编辑:澄清的第二个例子
最佳答案
如果您首先将每一对转换为元组,如下所示:
a = [tuple(item) for item in a]
b = [tuple(item) for item in b]
然后你可以简单地在两者之间使用集合union
:
c = set(a).union(b)
这将为您提供一个集合,其中每对中的一对在其中一个或两个集合中至少出现一次:
>>> c
{(1.0, 2.0), (3.0, 4.0), (2.0, 3.0), (1.0, 4.0)}
如果您希望此行为保持倍数,则只需替换 Counter
对于 set
,那么您可以使用 .elements()
将它们全部返回到一个集合中
from collections import Counter
a = [[2.0, 3.0], [1.0, 2.0] , [2.0, 3.0]]
b = [[1.0, 4.0], [2.0, 3.0] , [3.0, 4.0], [2.0, 3.0]]
a1 = Counter(map(tuple,a))
b1 = Counter(map(tuple,a))
c = a1 | b1
>>> c
Counter({(2.0, 3.0): 2, (1.0, 2.0): 1, (1.0, 4.0): 1, (3.0, 4.0): 1})
>>> list(c.elements())
[(2.0, 3.0), (2.0, 3.0), (1.0, 2.0), (1.0, 4.0), (3.0, 4.0)]
关于python - 从另一个列表中删除列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44687678/