如何在Python中实现列表在使用时自动实例化,像Perl一样?

4 投票
3 回答
948 浏览
提问于 2025-04-15 22:06

在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

有几种方法可以使用字典的方法来实现这个功能:

h.setdefault(x, []).append(y)

或者

h[x] = h.pop(x,[]).append(y)
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

撰写回答