如何在Python中实现列表在使用时自动实例化,像Perl一样?
在Perl语言中,我可以这样做:
push(@{$h->[x]}, y);
我能不能根据上面的Perl例子来简化以下的Python代码呢?
if x not in h:
h[x] = []
h[x].append(y)
我想简化这个,因为它在我的代码中出现了很多地方,(而且我不能用[]来初始化所有可能的x)。我不想把它做成一个函数,因为没有'inline'这个关键字。
有什么想法吗?
3 个回答
3
你可以使用 setdefault
这个方法。
h = {}
h.setdefault(x, []).append(y)
4
9
一种非常优雅的方法(自Python 2.5起)是使用来自“collections”模块的defaultdict
:
>>> from collections import defaultdict
>>> h = defaultdict(list)
>>> h['a'].append('b')
>>> h
defaultdict(<type 'list'>, {'a': ['b']})
defaultdict
就像一个普通的字典,但它在你创建时使用你传给它的构造函数提供一个默认值(在这个例子中是一个列表)。
我特别喜欢这个方法而不是字典的setdefault
方法,因为1)你把变量定义为一个defaultdict,通常代码不需要其他改动(除了可能需要去掉之前为默认值做的临时解决方案);2)setdefault这个名字实在太糟糕了 :P