3

オブジェクトのリストを取得し、リスト内の一意のアイテムのみを出力する小さなコードがあります。

これは私のコードです

def only_once(a):
    return [x for x in a if a.count(x) is 1]

ただし、私の先生は、この関数にセットを使用するように要求しています。誰かが私に何ができるかを教えてもらえますか?

私のコードは、a=[1,4,6,7,3,2,4,5,7,5,6] のような入力を取り、[1, 3, 2] を出力する必要があります。その順序も保持する必要があります。

4

3 に答える 3

3

最初の出現後の出現だけでなく、リストにあるアイテムを複数回削除する必要がある場合は、次を使用できます。

# without using generators / comprehensions
def only_once(iterable):
    seen = set()
    duplicates = set()
    for item in iterable:
        if item in seen:
            duplicates.add(item)
        seen.add(item)
    result = []
    for item in iterable:
        if item not in duplicates:
            result.append(item)
    return result

一般的な順序を維持する重複排除についてunique_everseenは、itertools のレシピを参照してください。

def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in ifilterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element
于 2012-10-14T21:09:09.010 に答える
3

[あなたも user1744238 と user1744316 であると想定しています -- ユーザー名を選んで、それをそのまま使用してください。そうすれば、質問のバリエーションと、既に試したことを簡単に確認できます。]

セットベースのアプローチの 1 つは、2 つのセットをカウンターとして使用することです。何かを一度見たか複数見たかだけを気にします。たとえば、説明しやすいアプローチは次のとおりです。

  1. onceとの空集合を作りmoreます。
  2. リストのすべての要素をループし、次のようにします。
    1. まだ見たことがない場合は、 に追加してonceください。
    2. 一度見たことがある場合は、 から削除してonceに追加してmoreください。
  3. これで、 set 内で一度だけ見た要素がわかりますonce
  4. リストの要素をループし、一度見たことがある場合は、それを出力リストに追加し、onceセットから削除して、同じ要素を 2 回出力しないようにします。

これは私に与えます:

In [49]: f([1,4,6,7,3,2,4,5,7,5,6])
Out[49]: [1, 3, 2]
于 2012-10-14T21:11:37.150 に答える
3

明確にするために、必要なのは一度だけ表示されるアイテムのセットです。

ここでの最良のオプションは を使用collections.Counter()することです。これは、アイテムごとに 1 回ではなく、アイテムを 1 回だけカウントすることを意味し、パフォーマンスが大幅に向上するためです。

>>> import collections
>>> {key for key, count in collections.Counter(a).items() if count == 1}
{1, 2, 3}

角括弧を中括弧に置き換えて、リスト内包表記に対する集合内包表記を意味し、結果のセットを取得します。

于 2012-10-14T20:59:48.823 に答える