4

Counter(from )がcollectionsあり、不要なアイテムのセットを除外したいと考えています。結果は、プロパティに一致しないアイテムのみを含む新しいカウンター (または、必要に応じてインプレースで行う) になります。で使用filterしてみましたCounterが、結果はCounterもう ではなく単なるlistです。setそこから不要なアイテムを差し引いてみましたCounterが、その操作は実装されていません。減算はCounter機能しますが、2 番目はありません。Counterそれを作成することは、基本的に実行しようとしているのと同じタスクです。

Counter([ 1,2,3,4,5,6,7,6,5,4,3,2,3,4,5,6,5,4,3,4,5,4 ])
→ Counter({4: 6, 5: 5, 3: 4, 6: 3, 2: 2, 1: 1, 7: 1})

2ここで、このカウンターからすべての値を削除したい3ので、結果は次のようになります。

Counter({4: 6, 5: 5, 6: 3, 1: 1, 7: 1})

これが私のアプローチです:

filter(lambda x: x not in (2, 3), c)
→ [1, 4, 5, 6, 7]

しかし、リストは必要ありません。

c - set([ 2, 3 ])
→ TypeError: unsupported operand type(s) for -: 'Counter' and 'set'

Counter次のように、展開された要素のリストを反復処理する sth を使用できます。

Counter(x for x in c.elements() if x not in (2, 3))
→ Counter({4: 6, 5: 5, 6: 3, 1: 1, 7: 1})

しかし、それは明らかに大量の場合、不必要にコストがかかります。

私がまだ見つけた唯一の(あまり良くない)解決策は、次のように面倒です:

Counter({ k: v for k, v in c.iteritems() if k not in (2, 3) })

私が見落としている、より簡単で読みやすいものはありますか?

Counterで使用できる実装済みの減算演算子がないのはなぜsetですか?

4

3 に答える 3

1

これを試して:

from collections import Counter
c=Counter([ 1,2,3,4,5,6,7,6,5,4,3,2,3,4,5,6,5,4,3,4,5,4 ])
c2=Counter()
for x in c.most_common():
    if x[1]<2 or x[1]>3:
        c2[x[0]]+=x[1]
print(c2)
于 2018-01-04T14:26:03.787 に答える