Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python setdefault不是左值,有什么解决办法吗?_Python_Dictionary - Fatal编程技术网

Python setdefault不是左值,有什么解决办法吗?

Python setdefault不是左值,有什么解决办法吗?,python,dictionary,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"%(ag

我有以下小程序:

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

histogram.setdefault(“age”,0)+=1#对于这个特定的应用程序,您应该使用

如果您确实需要一个
dict
,可以使用
dict
构造函数将计数器转换回dict

histogram = dict(Counter(args))

对于此特定应用程序,您应该使用

如果您确实需要一个
dict
,可以使用
dict
构造函数将计数器转换回dict

histogram = dict(Counter(args))

你可以预先初始化dict,即

histogram = dict(((a, 0) for a in set(ages)))

你可以预先初始化dict,即

histogram = dict(((a, 0) for a in set(ages)))
这是根据你的例子改编的

histogram_get = histogram.get
for age in ages:
    histogram[age] = histogram_get(age, 0) + 1
这是根据你的例子改编的

histogram_get = histogram.get
for age in ages:
    histogram[age] = histogram_get(age, 0) + 1

你对效率的评论是过早的优化,但如果这对你来说很重要,那么就做一些计时:我想你会发现双重查找比
setdefault
或使用
计数器
更快。调用诸如
setdefault
之类的方法需要查找字典才能找到该方法。您对效率的评论是过早的优化,但如果这对您来说很重要,那么请进行一些计时:我想您会发现双重查找比
setdefault
或使用
计数器
更快。调用方法,如
setdefault
,需要查找字典才能找到该方法。我接受这一最佳答案。下面的答案似乎表明计数器的效率并没有提高,但至少使用它意味着计数器的作者至少有可能在将来发现一些东西,然后我的代码将受益。我接受这一最佳答案。下面的答案似乎表明计数器的效率并没有提高,但至少使用它意味着至少计数器的作者有可能在将来发现一些东西,我的代码也会从中受益。