![](/img/trans.png)
[英]Why You Can't Compare STR to INT With IF/ELSE Statements & Work-Arounds
[英]Python setdefault not lvalue, any work-arounds?
我有以下小程序:
ages=[23,23,43,54,34,22,43,23]
histogram={}
for age in ages:
if not age in histogram:
histogram[age]=1
else:
histogram[age]+=1
for age,count in sorted(histogram.items()):
print "Age: %d Number of people: %d"%(age,count)
它創建一個簡單的列表中人的年齡直方圖。 但是,我發現直方圖哈希中的雙重查找非常難看。 我知道散列訪問基本上是O(1),所以它的效率沒有看起來的那么低,但是仍然...
我已經嘗試了多種解決方法,例如嘗試使用setdefault,但是以下方法無法實現:
histogram.setdefault("age",0)+=1 #<- Incorrect
我知道我可以使用defaultdict,但是它會更改創建的直方圖dict對象的行為,這不是我想要的。
如果我有辦法將這個問題設置為“低優先級”,我會這樣做,因為顯然這不是很重要。 但是,很長一段時間以來,我一直在尋找一種巧妙和/或優雅的解決方案。
因此,問題是:如何通過字典中的鍵增加整數,或者如果不存在則將其設置為1?
對於此特定應用程序,應使用Counter
。
from collections import Counter
ages = [23,23,43,54,34,22,43,23]
histogram = Counter(ages)
for age,count in sorted(histogram.items()):
print "Age: %d Number of people: %d"%(age,count)
如果確實需要dict
,則可以使用dict
構造函數將Counter轉換回dict
。
histogram = dict(Counter(args))
這就是collections.Counter
進行計數的方式 ,適合您的示例。
histogram_get = histogram.get
for age in ages:
histogram[age] = histogram_get(age, 0) + 1
histogram.setdefault("age", [0])[0] += 1
您可以預先初始化字典,即
histogram = dict(((a, 0) for a in set(ages)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.