set
は.update
を使用して複数のアイテムを追加し、.add
を使用して1つのアイテムを追加します。 collections.Counter
が同じように機能しないのはなぜですか?
Counter.update
を使用して単一のCounter
アイテムをインクリメントするには、リストに追加する必要があります。
c = Counter()
for item in something:
for property in properties_of_interest:
if item.has_some_property: # pseudocode: more complex logic here
c.update([item.property])
Elif item.has_some_other_property:
c.update([item.other_property])
# Elif... etc
Counter
をset
のように動作させることはできますか(つまり、プロパティをリストに入れる必要がなくなります)?
Edit:ユースケース:未知のオブジェクトがいくつかあり、それらについての予備的な事柄を見つけるためにさまざまなことをすばやく試している場合を想像してください:パフォーマンスとスケーリングは重要ではありません。理解すると、ロジックの追加と削除に時間がかかります。
さて、カウントするためにCounter
のメソッドを実際に使用する必要はありませんか?あります +=
演算子は、Counterと連動しても機能します。
c = Counter()
for item in something:
if item.has_some_property:
c[item.property] += 1
Elif item.has_some_other_property:
c[item.other_property] += 1
Elif item.has_some.third_property:
c[item.third_property] += 1
>>> c = collections.Counter(a=23, b=-9)
新しい要素を追加して、その値を次のように設定できます。
>>> c['d'] = 8
>>> c
Counter({'a': 23, 'd': 8, 'b': -9})
インクリメント:
>>> c['d'] += 1
>>> c
Counter({'a': 23, 'd': 9, 'b': -9}
ただし、c['b'] = 0
は削除しません:
>>> c['b'] = 0
>>> c
Counter({'a': 23, 'd': 9, 'b': 0})
削除するにはdel
を使用します:
>>> del c['b']
>>> c
Counter({'a': 23, 'd': 9})
カウンターはdictサブクラスです
あなたがしたいことをするよりPython的な方法があります:
c = Counter(item.property for item in something if item.has_some_property)
ループをオープンコーディングする代わりに generator expression を使用します。
編集:no-list-comprehensions段落が見つかりませんでした。私はまだこれが実際にCounter
を実際に使用する方法だと思います。ジェネレーター式またはリスト内包表記に入れるコードが多すぎる場合は、それを関数に組み込み、内包表記から呼び出すことをお勧めします。