ホームページ  >  記事  >  バックエンド開発  >  Python は要素の順序を変更せずにシーケンスから重複を削除する実装を実装します

Python は要素の順序を変更せずにシーケンスから重複を削除する実装を実装します

不言
不言転載
2018-10-15 14:15:332479ブラウズ

この記事で紹介する内容は、シーケンスから重複を削除し、要素の順序を変更しないという Python の実装に関するものです。一定の参考価値があります。困っている友人は参考にしてください。お役に立てば幸いです。 。 ヘルプ。

1. 要件

シーケンス内に出現する重複要素を削除しますが、残りの要素の順序は変更しないままにしたいと考えています。

重複を削除したいだけの場合、通常は、セットを構築するのが簡単な方法です:

a=[1,5,4,36,7,8,2,3,5,7]
#结果为:{1, 2, 3, 4, 5, 36, 7, 8}
print(set(a))

2. Solution

If the value in theシーケンスがハッシュ可能である場合、この問題はコレクションとジェネレーターを使用することで簡単に解決できます。

オブジェクトがハッシュ可能である場合、オブジェクトは存続期間中不変である必要があり、__hash__() メソッドが必要です。整数、浮動小数点数、文字列、要素はすべて不変です。
def dedupe(items):
    seen=set()
    for item in items:
        if item not in seen:
            yield item
            seen.add(item)

a=[1,2,3,1,9,1,5,10]
print(list(dedupe(a)))

実行結果:

[1, 2, 3, 9, 5, 10]

これは、シーケンス内の要素がハッシュ可能である場合にのみ実行できます。ハッシュ不可能なオブジェクト シーケンスから重複を削除する場合は、上記のコードを少し変更する必要があります:

def dedupe(items,key=None):
    seen=set()
    for item in items:
        value=item if key is None else key(item)
        if value not in seen:
            yield item
            seen.add(value)

a=[
    {'x':1,'y':2},
    {'x':1,'y':3},
    {'x':1,'y':4},
    {'x':1,'y':2},
    {'x':1,'y':3},
    {'x':1,'y':1},

]
print(list(dedupe(a,key=lambda d:(d['x'],d['y']))))

print(list(dedupe(a,key=lambda d:d['y'])))

実行結果:

[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 1, 'y': 4}, {'x': 1, 'y': 1}]
[{'x': 1, 'y': 2}, {'x': 1, 'y': 3}, {'x': 1, 'y': 4}, {'x': 1, 'y': 1}]

ここでのパラメータ キーの機能は、次のことを指定することです。使用する関数 重複を検出するために、シーケンス内の要素をハッシュ可能な型に変換します。

以上がPython は要素の順序を変更せずにシーケンスから重複を削除する実装を実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。