如何在字典中向Python列表追加元素,而无需初始化列表?

7
在PHP中,我可以这样做
$a['name'][] = 'el1';

在Python中,我必须这样做:

a = {}
a['name'] = []
a['name'].append('el1')

上述方法的问题在于,当迭代时我把a['name']重新初始化为空列表,这导致我失去了它的值。有没有一种方法可以在不需要先初始化为空列表的情况下向列表中添加元素?

字典不会包含重复的键。 - Avinash Raj
3个回答

13
你可以使用defaultdict模块:
from collections import defaultdict
a = defaultdict(list)

使用此设置,模块在首次访问时将初始化为空列表,因此您只需执行以下操作:

使用此设置,模块在首次访问时将初始化为空列表,因此您只需执行:

 a['name'].append('el1')

不用担心这件事。

希望能帮到你!


1
可能是Python v3的问题,但上述代码并不起作用,即使它能够工作,你仍然需要为每个要使用的列表执行listname = defaultdict(list),这并不能解决OP的问题。 - Steve Gon
已在Python 3.8.12上测试,仍然正常工作。 顺便说一下,listname = defaultdict(list) 不会创建一个列表。它创建了一个列表的字典。这正好解决了原始问题,因为您可以创建字典条目(列表名称)并将元素附加到列表中,而无需初始化任何内容。 - JamesTR

8
所以,按照你的表述方式,你只能对已经存在的内容进行“追加(append)”操作。尽管如此,你也可以选择不对其进行追加操作,而是这样做:
a = {'name': ['el1']}

不需要手动创建这样的结构。

如果您想在尝试添加到列表之前检查键是否存在,可以这样做:

a.setdefault('name', []).append('el1')
get的第二个参数可以指定默认值,如果name不存在则返回一个空列表。

你真的想在这里使用 setdefaulta.setdefault("name", []).append("el1") - kindall
@kindall 我才意识到 OP 在问什么。 - Slater Victoroff
1
每当我看到.setdefault,我就会问自己... 我是否真的想看到collections.defaultdict呢? - mgilson
你不需要将值赋回到 a['name'];事实上,这样做是错误的,因为现在你已经用 append 的返回值(即 None)覆盖了 a['name'] 的值。 - chepner

3
我认为您想要的是这样的内容:

我认为您正在寻求类似于这样的东西:

a = {}

if 'name' not in a:
    a['name'] = []

a['name'].append('el1')

另外,您可能需要查看Python的defaultdict数据类型,以确定是否更适合您的需求。


这是一种方法,没有看到您的完整代码以获取更多上下文信息,我会说这还不错。下面Rachel Sanders的出色答案也提供了有关defaultdict的更多信息。我会说,在这两者之间,这取决于您的口味。 - deadbeef404
@IsabellaWilcox 如果你的问题能够更加明确,那可能会有所帮助。不过上述代码并不是非常符合Python编程规范。 - Slater Victoroff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接