我有一本字典:
big_dict = {1:"1",
2:"2",
...
1000:"1000"}
(注意:我的字典实际上不是数字到字符串)
我正在将这本字典传递给调用它的函数。我经常将字典用于不同的功能。但是,有时我想在 big_dict
中发送一个额外的 key:item 对,这样我想发送的字典就相当于:
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')
是否有任何等效的方法可以用字典来做到这一点?
最佳答案
正如 Veedrac 指出的那样在 his answer ,此问题已在 Python 3.3+ 中以 ChainMap
的形式得到解决类:
function_that_uses_dict(ChainMap({1001 : "1001"}, big_dict))
如果你没有 Python 3.3,你应该使用一个向后移植,如果出于某种原因你不想,那么下面你可以看到如何自己实现它:)
您可以创建一个包装器,类似于此:
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
方法,或者使用 UserDict
作为基类,这应该可以简化这一点。
然后像这样使用它:
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)
关于python - 如何在python中传递带有附加元素的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27508561/