カウンターを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
クラスが機能を提供することに注意してください。defaultdict
Python2.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]