ヒストグラムを計算するPythonプログラムを作成する方法はたくさんあります。
ヒストグラムとは、でオブジェクトの出現をカウントiterable
し、そのカウントを辞書に出力する関数を意味します。例えば:
>>> L = 'abracadabra'
>>> histogram(L)
{'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r': 2}
この関数を作成する1つの方法は次のとおりです。
def histogram(L):
d = {}
for x in L:
if x in d:
d[x] += 1
else:
d[x] = 1
return d
この関数を書くためのより簡潔な方法はありますか?
Pythonで辞書の内包表記があれば、次のように書くことができます。
>>> { x: L.count(x) for x in set(L) }
しかし、Python 2.6にはそれらがないため、次のように記述する必要があります。
>>> dict([(x, L.count(x)) for x in set(L)])
このアプローチは読みやすいかもしれませんが、効率的ではありません。Lは複数回ウォークスルーされます。さらに、これはシングルライフジェネレーターでは機能しません。この関数は、次のようなイテレータジェネレータでも同様に機能するはずです。
def gen(L):
for x in L:
yield x
reduce
関数(RIP)を使おうとするかもしれません:
>>> reduce(lambda d,x: dict(d, x=d.get(x,0)+1), L, {}) # wrong!
おっと、これは機能しません。キー名は'x'
、ではなく、x
です。:(
私はで終わりました:
>>> reduce(lambda d,x: dict(d.items() + [(x, d.get(x, 0)+1)]), L, {})
(Python 3では、のlist(d.items())
代わりに記述する必要がありますd.items()
が、そこにないため、これは架空のreduce
ものです。)
より良い、より読みやすいワンライナーで私を打ち負かしてください!;)