gpt4 book ai didi

Python - 列表的最大公共(public)交集

转载 作者:行者123 更新时间:2023-11-28 20:49:35 26 4
gpt4 key购买 nike

我想从两个给定的嵌套列表中创建一个新的嵌套列表(每个列表中都有唯一的项目),以便新的嵌套列表是两个列表的最大公共(public)交集。

一个例子希望能帮助阐明我的问题:

    old1 = [[1,2],[3,4,5],[6,7,8],[9]]
old2 = [[1,2,3],[4,5,7],[6,8,10]]]
new = [[1,2],[3],[4,5],[6,8],[7],[9],[10]]

顺序并不重要,因此使用集合可能会有用。

有人有想法吗?任何帮助将不胜感激!

__

好的,很明显,最容易得到最大公共(public)交集的是

    new1 = filter(None,[list(set(o1) & set(o2)) for o1 in old1 for o2 in old2])
print new1
[[1, 2], [3], [4, 5], [7], [8, 6]]

如果你想包含只出现在一个旧列表中的整数,你可以在之后添加它们:

    a,b = set(sum(old1, [])), set(sum(old2, []))
c = (a | b) - (a & b)
for d in c:
new1.append([d])

谢谢大家的帮助!

最佳答案

就个人而言,我会首先使用集合交集来计算每个交集,然后添加剩余的任何项目(即,仅出现在 2 个列表之一上的项目):

>>> import itertools
>>> import functools
>>>
>>> old1 = [[1,2],[3,4,5],[6,7,8],[9]]
>>> old2 = [[1,2,3],[4,5,7],[6,8,10]]
>>>
>>> unique1 = functools.reduce(lambda a,b: set(a).union(set(b)),old1)
>>> unique2 = functools.reduce(lambda a,b: set(a).union(set(b)),old2)
>>> new = [list(set(a).intersection(set(b))) for a,b in itertools.product(old1,old2) if len(set(a).intersection(set(b))) != 0]
>>> new.extend([x] for x in unique1.symmetric_difference(unique2))
>>>
>>> new
[[1, 2], [3], [4, 5], [7], [8, 6], [9], [10]]

a 和 b 的对称差异等价于 (a|b)-(a&b),它产生的项目只出现在 2 个集合中的一个中。

(当然,您可以从 Grijesh Chauhan 的回答中获得一些灵感,以简化交集:new = filter(None, [list(set(a) & set(b)) for a in old1 for b in old2)]))

关于Python - 列表的最大公共(public)交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14196534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com