编写计算柱状图的python程序有很多种方法。
通过柱状图,我指的是一个计算对象在
iterable
并在字典中输出计数。例如:
>>> L = 'abracadabra'
>>> histogram(L)
{'a': 5, 'b': 2, 'c': 1, 'd': 1, 'r': 2}
编写此函数的一种方法是:
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
功能(R.I.P.):
>>> 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()
但这是假设,因为没有
减少
在那里)
请用更好、更易读的一行字打败我!;)