如何在python中传入包含其他元素的字典?

时间:2014-12-16 15:52:22

标签: python dictionary

我有一本字典:

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')

用字典有没有相同的方法呢?

4 个答案:

答案 0 :(得分:7)

正如Veedrachis 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