例如,假设我想建立一个直方图,我会这样:
hist = {}
for entry in data:
if entry["location"] in hist:
hist[entry["location"]] += 1
else:
hist[entry["location"]] = 1
有没有办法避免存在检查并根据其存在来初始化或更新密钥?
答案 0 :(得分:19)
您想要的是defaultdict
:
from collections import defaultdict
hist = defaultdict(int)
for entry in data:
hist[entry["location"]] += 1
defaultdict
default-构造dict中尚不存在的任何条目,因此对于int,它们从0开始,你只需为每个项添加一个。
答案 1 :(得分:11)
是的,你可以这样做:
hist[entry["location"]] = hist.get(entry["location"], 0) + 1
对于引用类型,您通常可以使用setdefault
来实现此目的,但如果dict
的右侧只是一个整数,则不适用。
Update( hist.setdefault( entry["location"], MakeNewEntry() ) )
答案 2 :(得分:6)
我知道你已经接受了答案但是你知道,自从Python 2.7以来,还有Counter
模块,这是明确针对这种情况制作的。
from collections import Counter
hist = Counter()
for entry in data:
hist[entry['location']] += 1
http://docs.python.org/library/collections.html#collections.Counter
答案 3 :(得分:1)
三元运算符是一个命令吗?
hist[entry["location"]] = hist[entry["location"]]+1 if entry["location"] in hist else 1
(编辑,因为我第一次搞砸了)