web-dev-qa-db-ja.com

Python Counterクラスの単一項目を追加またはインクリメントする方法

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

Countersetのように動作させることはできますか(つまり、プロパティをリストに入れる必要がなくなります)?

Edit:ユースケース:未知のオブジェクトがいくつかあり、それらについての予備的な事柄を見つけるためにさまざまなことをすばやく試している場合を想像してください:パフォーマンスとスケーリングは重要ではありません。理解すると、ロジックの追加と削除に時間がかかります。

18
scharfmn

さて、カウントするために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
19
shx2
>>> 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サブクラスです

11
Vidhya G

あなたがしたいことをするよりPython的な方法があります:

c = Counter(item.property for item in something if item.has_some_property)

ループをオープンコーディングする代わりに generator expression を使用します。

編集:no-list-comprehensions段落が見つかりませんでした。私はまだこれが実際にCounterを実際に使用する方法だと思います。ジェネレーター式またはリスト内包表記に入れるコードが多すぎる場合は、それを関数に組み込み、内包表記から呼び出すことをお勧めします。

3