編寫計算柱狀圖的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()
但這是假設,因為沒有
減少
在那裡)
請用更好、更易讀的一行字打敗我!;)