在Python中用一个字典更新另一个字典

2 投票
3 回答
1836 浏览
提问于 2025-04-17 20:45

我想通过命令行发送一个字典的键。sys.argv[1]里存的是这个键。这个键被存储在var2中,然后传给一个叫append_func的函数,这个函数在另一个文件里负责添加内容。每次我在命令行输入键的时候,我希望字典能被添加新的内容。但是每次输入新的命令行参数时,它都会覆盖之前的内容。

请看一下这段代码:

##filename : dictionary.py## 

import sys
import append
dic={}
var1=sys.argv[0]
var2=sys.argv[1]
dicto=append.append_fun(var2,dic)
dic=dic.update(dicto)
print dic

##filename : append.py##
def append_fun(var2,dic1):
    dic1[var2] = "hello"
    return dic1

在命令行中,我调用了dictionary.py test。然后再次调用dictionary.py test1时,字典dic并没有把两个值都添加进去,而是用第二个值覆盖了第一个值。

请帮我看看怎么才能把dic字典里的内容添加上去,而不是覆盖掉。

3 个回答

0

在Python中,字典是一种可变对象。这意味着你对字典的修改是直接在原来的地方进行的。所以你写

dic.update(dicto)

因为update这个方法不会返回任何东西。类似的:

def append_fun(var2,dic1):
    dic1[var2] = "hello"

还有

append.append_fun(var2,dic)
1

在我们开始讨论你的问题之前,你真的应该把这段代码放到codereview.stackexchange.com上去。我觉得很难理解你为什么选择了

dicto=append.append_fun(var2,dic)

而不是

dicto[var2] = "hello"

如果我理解得没错的话,你想要一个字典,当你给它赋值时,会把这个值添加到已经存储在那个键下的其他值中,对吧?如果是这样的话,你一定会喜欢collections.defaultdict。我希望如此。虽然它可能不能完全做到这一点,但我觉得它能提供你想要的功能。

当你创建一个defaultdict时,你需要用一个参数来调用这个类,这个参数是一个函数,当你试图获取一个不存在的键时,这个函数会被调用来创建一个新的值。因为list()会返回一个空列表,所以当你尝试获取任何键时,这个键会被创建,并与通过调用默认对象函数(在创建对象时提供的那个函数)生成的值关联。我希望下面的互动示例能解释你需要知道的内容,但如果不够清楚,可以查看我链接的文档。

>>> import collections
>>> mydict = collections.defaultdict(list)
>>> mydict['newkey'].append("Surprise!") # empty list invisibly created
>>> mydict['newkey']
['Surprise!']
>>> mydict['newkey'].append("Surprise again!")
>>> mydict['newkey']
['Surprise!', 'Surprise again!']
>>> mydict['no such key']
[]
>>> list(mydict.keys())
['no such key', 'newkey']
>>>

这样有帮助吗,还是我在说错话?

2

你似乎想要实现一种叫做持久化的功能,这样你就可以先运行一段代码:

python dictionary.py test

然后再执行一次:

python dictionary.py test1

而且希望第一次运行的结果能够保留下来。但是你并没有保存第一次运行的数据,所以现在这样是行不通的,因为每次执行到 dic={} 这一行时,都会重新初始化一个空的字典。

要实现这个功能,你需要在某个地方保存状态,比如在一个临时文件或者数据库里。你需要把 dic={} 这一行改成在启动时重新加载之前的状态(当然,在退出之前你也要把当前的状态保存下来)。

我建议你看看pickle,这是一个简单易用的工具,可以把Python对象保存到磁盘上。

撰写回答