2

与えられた 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]]

古いリストの 1 つにのみ表示される整数を含めたい場合は、後で追加できます。

    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 つのリストの 1 つだけに表示される項目) を追加します。

>>> 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 つのセットの 1 つだけに現れる項目が得られます。

(もちろん、交差点を単純化するために、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

2 つのリストの交点:

>>> 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あなたが説明したように。

最初に list の list を list に変換し ( old1&の両方ld2)、2-D list を 1-D list に変換します。

>>> 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まだ不完全: 最後のステップ:

にない要素 old1 または に ない要素をリストし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]

in listの要素を listとして追加します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 に答える