在Python中用一个字典更新另一个字典
我想通过命令行发送一个字典的键。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 个回答
在Python中,字典是一种可变对象。这意味着你对字典的修改是直接在原来的地方进行的。所以你写
dic.update(dicto)
因为update
这个方法不会返回任何东西。类似的:
def append_fun(var2,dic1):
dic1[var2] = "hello"
还有
append.append_fun(var2,dic)
在我们开始讨论你的问题之前,你真的应该把这段代码放到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']
>>>
这样有帮助吗,还是我在说错话?
你似乎想要实现一种叫做持久化的功能,这样你就可以先运行一段代码:
python dictionary.py test
然后再执行一次:
python dictionary.py test1
而且希望第一次运行的结果能够保留下来。但是你并没有保存第一次运行的数据,所以现在这样是行不通的,因为每次执行到 dic={}
这一行时,都会重新初始化一个空的字典。
要实现这个功能,你需要在某个地方保存状态,比如在一个临时文件或者数据库里。你需要把 dic={}
这一行改成在启动时重新加载之前的状态(当然,在退出之前你也要把当前的状态保存下来)。
我建议你看看pickle,这是一个简单易用的工具,可以把Python对象保存到磁盘上。