0

リストのリストがあります。各リストには、最初と最後の値が規定されています。最初と最後の値の組み合わせごとに、一意のリストの総数を見つけたいと思います。一意性は、同じ最初と最後の値の組み合わせを持つリスト間で、リストの途中 (最初と最後の値の間) で要素の重複がないように定義されます。

たとえば、次のリストのリストの場合。

[[2, 5, 7, 12], [2, 5, 10, 12], [2, 3, 12], [3, 34, 4, 6], [3, 4, 6]]

[2,...,12] と [3,...,6] の 2 つの最初と最後の値の組み合わせがあります。一意のリストの 1 つのセットは次のようになります。

[[2, 5, 7, 12], [2, 3, 12], [3, 34, 4, 6]]

一意のリストの他の組み合わせも可能ですが、一意のリストの数だけに関心があります。上記の例では、組み合わせ [2,...,12] に対して 2 つの一意のリストがあり、組み合わせ [3,...,6] に対して 1 つの一意のリストがあります。

Pythonでこれを行う最良の方法は何ですか?

4

2 に答える 2

2

最も直接的な方法は、最初と最後の値ですべてのリストにインデックスを付けてから、これらをフィルタリングすることです。

これらすべてのリストを、すべてのキーが(first, last)タプルである辞書に追加することで、これを行うことができます。次に、これらのそれぞれを調べて、重複を削除します。

簡単な例:

mapping = defaultdict(list)
for item in target_lists:
   mapping[item[0], item[-1]].append(item)

for k, items in mapping.iteritems():
   mapping[k] = [some_filter_function(v) for v in items]

条件を設定して、重複しているかどうかを判断するには、これを少し変更する必要があります (基準を理解しているかどうかわかりません)。

それが役に立てば幸い!

更新

私はあなたの基準を理解したと思います。あなたがしなければならないことは、リスト内のどの要素が複数回出現するかを追跡することです. そして、そこにあるべきではない要素があるかどうか、作成したレコード (一度だけ記録されます) に対してチェックして、リストを調べます。存在する場合、その要素を破棄します。これを行う 1 つの方法は次のようになります。

for k, items in mapping.iteritems():
    count_item = defaultdict(int)
    for item in items:
        for i in item[1:-1]:
            count_item[i] += 1
    mapping[k] = [item for item in items if all(count_item[i] == 1 for i in item[1:-1])]

それはそれを行う方法の1つです。しかし、2 つのループを作成する必要があることはほぼ確実です。実装は異なる場合があります。

于 2013-04-01T19:49:27.853 に答える