python - 如何在python中传递带有附加元素的字典?

标签 python dictionary

我有一本字典:

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/

相关文章:

c++ - 是否有适合度假的标准容器?

python - 使用 Python seaborn 绘制两侧分组条形图

python - 以 boarder 作为拟合参数拟合两个不同的函数

python - 如何提取与文本文件中的正则表达式匹配的行号

python - 重命名为数字的 Pandas DataFrame 列

json - 如何检查值是否在字典中?

python - Linux 上缺少 Selenium Firefox 配置文件

c++ - boost 哈纳 : create a map from a set and a default value

python - 我可以展平一个深度嵌套的 Python 字典,它包含带有更多嵌套字典列表的值吗?

python - 在带有元组键的字典上使用Python 'not in',我没有所有元组部分