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
ですか?