我有一本字典:
big_dict = {1:"1",
2:"2",
...
1000:"1000"}
(注意:我的字典实际上不是数字到字符串)
我将这个字典传递给一个调用它的函数。我经常使用字典来实现不同的功能。但是,有时我想在big_dict
中发送一个额外的密钥:项目对,这样我想发送的字典就相当于:
big_dict[1001]="1001"
但我不想实际将值添加到字典中。我可以复制一本字典并将其添加到那里,但我想避免这会占用内存+ CPU周期。
我目前的代码是:
big_dict[1001]="1001"
function_that_uses_dict(big_dict)
del big_dict[1001]
虽然这种方法有效,但它似乎相当笨拙。
如果这是我要做的字符串:
function_that_uses_string(myString + 'what I want to add on')
用字典有没有相同的方法呢?
答案 0 :(得分:7)
正如Veedrac中his answer所指出的那样,这个问题已经在{3.3}类的形式中以Python {+ 3}}的形式得到了解决:
function_that_uses_dict(ChainMap({1001 : "1001"}, big_dict))
如果您没有Python 3.3,您应该使用backport,如果由于某种原因您不想这样做,那么下面您可以看到如何自己实现它:)
您可以创建一个包装器,类似于:
class DictAdditionalValueWrapper:
def __init__(self, baseDict, specialKey, specialValue):
self.baseDict = baseDict
self.specialKey = specialKey
self.specialValue = specialValue
def __getitem__(self, key):
if key == self.specialKey:
return self.specialValue
return self.baseDict[key]
# ...
当然,您需要提供所有其他dict
方法,或使用ChainMap
作为基类,这应该简化这一过程。
然后像这样使用它:
function_that_uses_dict(DictAdditionalValueWrapper(big_dict, 1001, "1001"))
这可以很容易地扩展到“特殊”键和值的整个附加词典,而不仅仅是单个附加元素。
您还可以扩展此方法,以达到与字符串示例类似的内容:
class AdditionalKeyValuePair:
def __init__(self, specialKey, specialValue):
self.specialKey = specialKey
self.specialValue = specialValue
def __add__(self, d):
if not isinstance(d, dict):
raise Exception("Not a dict in AdditionalKeyValuePair")
return DictAdditionalValueWrapper(d, self.specialKey, self.specialValue)
并像这样使用它:
function_that_uses_dict(AdditionalKeyValuePair(1001, "1001") + big_dict)
答案 1 :(得分:3)
如果您使用的是3.3+,请使用ChainMap
。否则使用backport。
new_dict = ChainMap({1001: "1001"}, old_dict)
答案 2 :(得分:1)
您可以添加额外的键值对,保留原始词典,如下所示:
>>> def function_that_uses_bdict(big_dict):
... print big_dict[1001]
...
>>> dct = {1:'1', 2:'2'}
>>> function_that_uses_bdict(dict(dct.items()+[(1001,'1001')]))
1001
>>> dct
{1: '1', 2: '2'} # original unchanged
答案 3 :(得分:0)
这也有点烦人,但你可以让函数接受两个参数,其中一个是big_dict,另一个是临时字典,只为函数创建(类似于fxn(big_dict, {1001,'1001'})
)。然后,您可以访问这两个词典而无需更改第一个词典,也无需复制big_dict
。