2

これが私が問題を抱えているタスクです:

リストの 2 つのリストが与えられた場合、それらをフィルタリングして、共通点のない項目のみに絞り込みます。例)内部リストが同一である場合、それらを除外します。内部リストに共通の項目が少なくとも 1 つある場合は、それらも除外します。

注: ネストのレベルは 1 つだけです。内部リストは文字列のみで構成されます。私はうまくいく解決策を持っていますが、それは非常に面倒です。改善のためのフィードバックをお待ちしております:

最初に、両方のリストで完全に一致するものを除外します。

l3 = filter(lambda x: x not in l2, l1)
l4 = filter(lambda x: x not in l1, l2)

まったく同じアイテムを持たないリストの 2 つのリストになってしまいます。ここで、内側のリストを繰り返し処理し、他の内側のリストとアイテムを共有するリストをすべて取り除きます。

私がやっている:

    for i in l3:
        for j in i:
            for k in l4:
                if j in k:
                    print j, k
                    removel3.append(tuple(i))
                    removel4.append(tuple(k))
    for i in l4:
        for j in i:
            for k in l3:
                if j in k:
                    removel3.append(tuple(k))
                    removel4.append(tuple(i))
    for i in list(set(removel3)):
        l3.remove(list(i))
    for i in list(set(removel4)):
        l4.remove(list(i))

(反復ループで直接削除すると、リストのインデックス作成が台無しになり、アイテムがスキップされるため、リストから削除するものの個別のリストを作成します。それを行うためのより良い方法が必要ですが、私はそれを知りません。)

しかし、ええ。それは仕事を成し遂げますが、タプルからセット、リスト、さらにタプルへと進むことは非常に非pythonicに聞こえます。:) フィードバックをお待ちしております。

編集:

サンプル入力:

l1 = [['A', 'B', 'C'], ['D', 'E'], ['F', 'G', 'H']]
l2 = [['A', 'B', 'C'], ['D', 'I'], ['K', 'L', 'M']]

上記のすべての変換の後、最終的には次のようになります。

>>> l3
[['F', 'G', 'H']]
>>> l4
[['K', 'L', 'M']]
4

2 に答える 2

4

私はあなたを理解しているかどうか確信が持てませんが、試してみます。

# first, get all elements from each list as a flat set.
import itertools
set1 = set(itertools.chain.from_iterable(list1))
set2 = set(itertools.chain.from_iterable(list2))

#Now, figure out which elements they have in common
common_elements = set1 & set2

#Now eliminate inner lists which have elements in the common set
new_list1 = [lst for lst in list1 if not any(x in common_elements for x in lst)]
new_list2 = [lst for lst in list2 if not any(x in common_elements for x in lst)]

サブリストがハッシュ可能なオブジェクトを保持しているため、これを実行できることに注意してください。

于 2013-10-10T15:35:57.300 に答える
2

このようなフィルターが必要だと思います

filter(lambda sublist:not any(set(sublist).intersection(x) for x in list2),list1)
于 2013-10-10T15:40:55.727 に答える