我们可以改变python字典的基本提取行为吗

时间:2019-04-03 14:14:34

标签: python python-3.x dictionary

字典提取常规方法

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
print(d['a'])  # prints: 1

要求:

print(d['a', 'b'])  # should print: [1, 2]

通过子类dict并修改__getitem__()方法(如果可能的话),将有可能做到这一点吗?

2 个答案:

答案 0 :(得分:0)

如果您真的想使用子类化,则可以很好地完成工作:

class CustomDict(dict):
    def __init__(self, dic):
        self.dic = dic

    def __getitem__(self, items):
        values = []
        for item in items:
            values.append(self.dic[item])
        return values if len(values) > 1 else values[0]


d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

new_d = CustomDict(d)

print(new_d['a'])
print(new_d['a', 'b'])
print(new_d['a', 'b', 'c'])
print(new_d['a', 'c', 'd'])
  

输出:

1
[1, 2]
[1, 2, 3]
[1, 3, 4]

说明:

new_dCustomDict类的对象,它将始终使用父类的方法(这样就可以遍历该对象以及您可能希望对字典工作执行的其他操作),除非调用其中一种覆盖方法(init,getitem)。

因此,当一个人使用new_d['a', 'b']时,将调用覆盖的__getitem__方法。覆盖的方法使用__getitem__中的self.dic(这是普通字典)来实际访问给定每个键的字典值。

答案 1 :(得分:-2)

def ret_multiple(dict, *args)
    for k in args:
        if k in dict:
            ret.append(dict[k])
    return ret

vals = ret_multiple(d, 'a', 'b')