0

ノード分析をしようとしているときに、次の問題があります。

例えば:

my_list=[[1,2,3,1],[2,3,1,2],[3,2,1,3]]

次の方法で my_list 内の element_list を処理する関数を書きたいと思います。

- my_list のリスト内の特定の要素の出現回数は重要ではなく、リスト内の一意の要素が同じである限り、それらは同一です。

上記の前提に基づいて同一のループを見つけ、最初のループのみを保持し、順序を維持しながら my_list の他の同一のリストを無視します。

したがって、上記の例では、 my_list 内のすべてのリストが上記の前提に基づいて等しいため、関数は [1,2,3,1] である最初のリストのみを返す必要があります。

これを行うためにPythonで関数を作成しましたが、短縮できると思います。これが効率的な方法であるかどうかはわかりません。これが私のコードです:

def _remove_duplicate_loops(duplicate_loop):

        loops=[]
        for i in range(len(duplicate_loop)):

            unique_el_list=[]

            for j in range(len(duplicate_loop[i])):
                if (duplicate_loop[i][j] not in unique_el_list):
                    unique_el_list.append(duplicate_loop[i][j])

            loops.append(unique_el_list[:])

        loops_set=[set(x) for x in loops]
        unique_loop_dict={}

        for k in range(len(loops_set)):
            if (loops_set[k] not in list(unique_loop_dict.values())):
                unique_loop_dict[k]=loops_set[k]

        unique_loop_pos=list(unique_loop_dict.keys())

        unique_loops=[]

        for l in range(len(unique_loop_pos)):
            unique_loops.append(duplicate_loop[l])

        return unique_loops
4

2 に答える 2

4
from collections import OrderedDict
my_list = [[1, 2, 3, 1], [2, 3, 1, 2], [3, 2, 1, 3]]

seen_combos = OrderedDict()
for sublist in my_list:
    unique_elements = frozenset(sublist)
    if unique_elements not in seen_combos:
        seen_combos[unique_elements] = sublist
my_list = seen_combos.values()
于 2013-10-23T14:38:25.147 に答える
2

辞書を使用して、かなり簡単な方法でそれを行うことができます。ただし、セットは変更可能でハッシュ可能ではないため、frozenset代わりにを使用する必要があります。set

def _remove_duplicate_lists(duplicate_loop):
     dupdict = OrderedDict((frozenset(x), x) for x in reversed(duplicate_loop))
     return reversed(dupdict.values())

するべきです。double reversed() に注意してください。通常、最初の が必要な場所で最後のアイテムが保持され、ダブル リバースがそれを実現するためです。

編集:修正、はい、スティーブンの答えによると、それは OrderedDict() である必要があります。そうしないと、返される値が正しくなくなります。彼のバージョンも少し速いかもしれません..

もう一度編集: リストの順序が重要な場合は、順序付けられた dict が必要です。あなたのリストが

[[1,2,3,4], [4,3,2,1], [5,6,7,8]]

注文された辞書バージョンは常に返されます

[[1,2,3,4], [5,6,7,8]]

ただし、通常の dict バージョンは上記を返すか、または返す可能性があります

[[5,6,7,8], [1,2,3,4]]

気にしない場合は、順序付けされていない dict バージョンの方が高速で、メモリの使用量が少ない可能性があります。

于 2013-10-23T14:40:09.360 に答える