1

私は setdefault を使用して、このようなインスタンスをカウントします (これはストリップダウン バージョンです)。

user_to_count_map = {}
for username in list_of_usernames:
    x = user_to_count_map.setdefault(username, 0)
    x += 1
    user_to_count_map[username] = x + 1
for username in sorted(usernmae_to_count_map):
    print username, user_to_count_map[username]

実際のコードは複数のカウントの増加により複雑になるため、マップへの割り当ては好きではありません。しかし、私はそうする必要があるようです。それを回避する簡単な方法はありますか?

4

3 に答える 3

5

要素を数えるには、次を使用する必要がありますCounter

import collections
user_counts = collections.Counter(list_of_usernames)
print(user_counts.most_common())

あるいは、geta のメソッドはdictと同じsetdefaultことを行いますが、dict に値を格納するという副作用はありません。

user_to_count_map = {}
for username in list_of_usernames:
    user_to_count_map[username] = user_to_count_map.get(username, 0) + 1
于 2012-05-28T10:13:16.580 に答える
1

カウンターを1つの要素を持つリストにして、効果的に変更可能にすることができます。

user_to_count_map = {}
for username in list_of_usernames:
    x = user_to_count_map.setdefault(username, [0])
    x[0] += 1
for username, counter in sorted(user_to_count_map.items()):
    print username, counter[0]

暗黙的よりも明示的の方が優れているため、コードが読みやすくなるかどうかはわかりません。

または、Python 2.7以降を使用する(または便利なバックポートを使用する)場合は、Counterオブジェクトを使用できます。

from collections import Counter
user_to_count_map = Counter()
for username in list_of_usernames:
    user_to_count_map[username] += 1
for username, counter in sorted(user_to_count_map.items()):
    print username, counter[0]        

を使用すると、デフォルト値0が自動的にCounter与えられるディクショナリがあることに注意してください。それ以外の場合は整数値を保持するディクショナリのように機能するため、これらの値を任意の方法でインクリメントおよびデクリメントできます(1以上の追加を含む)。

defaultdictコレクションモジュールでも同じ効果が得られますが、Counterクラスが機能を提供することに注意してください。defaultdictPython2.5以降に存在します。例:

from collections import defaultdict
user_to_count_map = defaultdict(lambda: 0)
for username in list_of_usernames:
    user_to_count_map[username] += 1

または、とにかく常にマッピングに割り当てを戻すため、setdefaultを完全に省略できます。

user_to_count_map = {}
for username in list_of_usernames:
    x = user_to_count_map.get(username, 0)
    x += 1
    user_to_count_map[x] = x
for username, counter in sorted(user_to_count_map.items()):
    print username, counter[0]
于 2012-05-28T10:15:55.790 に答える
0

setdefault が気に入らず、常に 0 から始める場合は、次のようにします。

from collections import defaultdict

user_to_count_map = defaultdict(lambda: [0])
for username in list_of_usernames:
    # no set_default
    user_to_count_map[username][0] += value

for username, counter in sorted(user_to_count_map.items()):
    print username, counter[0]
于 2012-05-28T14:41:45.233 に答える