我有一本字典:
big_dict = {1:"1",
2:"2",
...
1000:"1000"}
Run Code Online (Sandbox Code Playgroud)
(注意:我的字典实际上不是字符串的数字)
我将这个字典传递给一个需要它的函数.我经常使用字典来实现不同的功能.但是,有时候我想发送big_dict一个额外的密钥:项目对,这样我想发送的字典就相当于:
big_dict[1001]="1001"
Run Code Online (Sandbox Code Playgroud)
但我不想实际将值添加到字典中.我可以制作字典的副本并将其添加到那里,但我想避免这会消耗的内存+ CPU周期.
我目前的代码是:
big_dict[1001]="1001"
function_that_uses_dict(big_dict)
del big_dict[1001]
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但它似乎相当笨拙.
如果这是一个我会做的字符串:
function_that_uses_string(myString + 'what I want to add on')
Run Code Online (Sandbox Code Playgroud)
用字典有没有相同的方法呢?
正如Veedrac在他的回答中指出的那样,这个问题已经在Python 3.3+中以ChainMap类的形式得到了解决:
function_that_uses_dict(ChainMap({1001 : "1001"}, big_dict))
Run Code Online (Sandbox Code Playgroud)
如果你没有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]
# ...
Run Code Online (Sandbox Code Playgroud)
dict当然,您需要提供所有其他方法,或者使用UserDict作为基类,这应该简化这一点.
然后像这样使用它:
function_that_uses_dict(DictAdditionalValueWrapper(big_dict, 1001, "1001"))
Run Code Online (Sandbox Code Playgroud)
这可以很容易地扩展到"特殊"键和值的整个附加字典,而不仅仅是单个附加元素.
您还可以扩展此方法以达到类似于字符串示例中的类似内容:
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)
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
function_that_uses_dict(AdditionalKeyValuePair(1001, "1001") + big_dict)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |