2

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

一个例子希望有助于澄清我的问题:

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

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

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

__

好的,很明显,最容易获得最大公共交点的是

    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])

谢谢大家的帮助!

4

2 回答 2

4

就个人而言,我会首先使用集合交集来计算每个交集,然后添加任何剩余的项目(即,项目仅出现在 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)]):)

于 2013-01-07T13:12:49.473 回答
3

两个列表的交集:

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

最大的共同点是什么?为什么被[9],[10]包括在内?

编辑

Greatest Common Intersection正如你所描述的。

首先将列表列表转换为列表(old1& ld2),将二维列表转换为一维列表

>>> e_o1 = reduce(list.__add__, old1)
>>> e_o1
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> e_o2 = reduce(list.__add__, old2)
>>> e_o2
[1, 2, 3, 4, 5, 7, 6, 8, 10]  

使用交叉路口: _filter()

>>> new = filter(None,[list(set(o1) & set(o2)) for o1 in old1 for o2 in old2])  

new仍然不完整:最后一步:

现在列出不在 in old1 或 in old2中的元素,创建临时列表tl

>>> tl=filter(lambda x : x not in e_o1 or x not in e_o2 , set(e_o1) | set(e_o2)) 
>>> tl
[9, 10]

现在将列表的元素附加 tlnew列表:

>>> filter(lambda x:  new.append([x]) ,tl)
[]
>>> new
[[1, 2], [3], [4, 5], [7], [8, 6], [9], [10]]  

但结果仍然类似于Adrien Plisson代码的工作原理:

old1 = [[1,2],[3,4]]并且old2 = [[1,2],[5,6]]
它将产生[[1,2],[3],[4],[5],[6]]

于 2013-01-07T13:14:29.003 回答