Python setdefault不是左值,任何解决方法?

时间:2012-01-23 07:13:35

标签: python dictionary

我有以下小程序:

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?

4 个答案:

答案 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