0

私の仕事は、セットを使用して、重複のリストを一意の番号のリストに変換することです。でも、ポジションは守りたい。

簡単だと思いました。そこで、最初に元のリストの位置を格納する辞書を作成しました。

def get_positions(a): 
    positions = {}

    for ele in a: 
        if not ele in positions:
            positions[ele] = a.index(ele) 

    return positions

リストがあるとしましょうa = [1, 2, 4, 4, 5]

位置は、私に の辞書を提供し{0:1, 1:2, 2:4, 3:4, 4:5}ます。

ただし、番号を繰り返しても位置が保存されないため、これは失敗しました。

これを達成する方法はありますか?

ありがとう。

アップデート:

はっきりしなかったようです。私はセットを使用する必要があります。したがって、リスト a=[1,2,4,4,5] を取得し、それをセットに変換して重複を消去する必要があります。次に、同じ順序で要素を含むリストを取得する必要があります。(割り当ての問題です)

4

5 に答える 5

2

あなたはこれについて間違った方法で進んでいると思います。リストから重複を削除しようとしていますが、重複を削除せずにリスト内の物の位置を取得することで解決しようとしている問題があります。代わりに、次のようなことを行う方が良いと思います。

def remove_duplicates(seq):
    new_list = []
    for i in seq:
        if i not in new_list:
            new_list.append(i)
    return new_list

セットを使用してこれを行うかなり読みやすい方法の 1 つ (対応する O(1) メンバーシップ テスト (ただしメモリ使用量が多い) を使用) は次のとおりです。

def remove_duplicates(seq):
    seen = set()
    new_list = []
    for i in seq:
        if i not in seen:
            new_list.append(i)
            seen.add(i)
    return new_list

同じ質問に対するこの回答もセットを使用しており、かなり高速である可能性があります(ただし、を使用する際に少しハックを使用していますand not set.add)。

于 2013-10-08T15:05:32.773 に答える
1

これは、ループと if ステートメントで実行できます。

>>> oldlist = [1,2,3,3,4,5,4,5,6,2,3,5,7,8,3,3,3,9]
>>> newlist = []
>>> for x in oldlist:
...  if not x in newlist:
...   newlist.append(x)
...
>>> newlist
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
于 2013-10-08T15:05:46.373 に答える
0

OrderedSetが必要です。しかし、これは宿題のように聞こえます。彼らがそれを受け入れるかどうかはわかりません。

于 2013-10-08T15:16:56.783 に答える
0

(位置、要素) を使用してタプルのセットとして格納します。

于 2013-10-08T15:06:02.853 に答える