我有以下小程序:
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对象的行为,这不是我想要的。
如果我有办法将这个问题设置为“低优先级”,我会这样做,因为这显然不是很重要。但是我一直在寻找这个问题的聪明和/或优雅的解决方案。
所以,问题是:如何通过dict中的键递增整数,或者如果它不存在则将其设置为1?
答案 0 :(得分:5)
对于此特定应用程序,您应使用a 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))
答案 1 :(得分:1)
这是how collections.Counter
does the counting,适合您的示例。
histogram_get = histogram.get
for age in ages:
histogram[age] = histogram_get(age, 0) + 1
答案 2 :(得分:0)
您可以预先初写dict,即
histogram = dict(((a, 0) for a in set(ages)))
答案 3 :(得分:0)
histogram.setdefault("age", [0])[0] += 1