在Python中向字典添加值

1 投票
3 回答
9774 浏览
提问于 2025-04-17 10:26

我在想用字典来处理一些数据输出的聪明方法。我有一个独特的键,跟它相关联的还有其他值。比如说,我们有 1:[2, 3, 4, 7] 和 2:[8, 9, 5]。我想做的是能够添加值,比如对第一个键,我想加上数字 13,结果应该是这样的:

1:[2, 3, 4, 7, 13], 2:[8, 9, 5]

但是用 append 方法似乎不是最聪明的做法。我现在使用的是:

dict[master = dict[master].append(id)

但我得到的错误是:

AttributeError: 'int' object has no attribute 'append'

现在,我可以简单地把这个键之前的值拿出来,然后这样做(id = 17):

newvalue = values, id

但这样会导致多出一些括号,比如:

1:[[2, 3, 4, 7, 13], 17] 

那么,有没有什么聪明的方法可以确保我只得到一组括号里的数字,也就是说:

1:[2, 3, 4, 7, 13, 17] 

我可以使用一些去除多余的函数,但有没有简单又好用的方法呢?我可能在这里忽略了一些简单的东西。提前谢谢大家。

3 个回答

1

(1) 创建一个类来封装这个功能(更好的做法是用 defaultdict(deque) 来替代 dict,正如 @kindall 所建议的;如果你只需要这个功能,就不需要新建一个类)。

(2) 在你的字典中,每个条目的值都使用 deque,即使是空的或者只有一个值的条目,也要把值添加到这个 deque 中。deque 设计上是为了在两端都能快速添加元素,而 list 实际上是一个向量。

4

列表是可以改变的。你可以直接在原来的地方修改它。

dict[master].append(id)
6

使用一个 collections.defaultdict(顺便说一下,可以把每个条目都设成 collections.deque,这样更有趣;当然,你也可以用普通的 list)。

from collections import defaultdict, deque

d = defaultdict(deque)   # or ...(list)

d[1].append(2)
d[1].extend([3, 4, 7, 13])

这里的基本思路是,你的字典里的值总是 deque,而且你总是往里面添加内容,所以你根本不用担心值是不是 int。如果你使用一个在字典中不存在的键,defaultdict 会自动为你创建一个新的 deque,所以你也不用检查这个键在字典里是否已经存在。

如果你已经有一个普通的字典,里面的值都是单个的 int——比如说这是你调用某个函数后得到的返回值——你可以直接用这个字典来构建一个新的字典,然后再用它来做你想做的事情。

d = defaultdict(deque)
for key, value in old_d.iteritems():
    d[key].append(value)

撰写回答