gpt4 book ai didi

Python 创建自己的字典子集的字典 View

转载 作者:太空狗 更新时间:2023-10-30 00:41:40 26 4
gpt4 key购买 nike

正如 SO 上关于该主题的许多问题所证明的那样,获取字典的一部分是一项非常常见的任务,并且有一个相当不错的解决方案:

{k:v for k,v in dict.viewitems() if some_test(k,v)}

但这会创建一个新字典,它有自己的映射。对于许多操作,最好只拥有原始字典的不可变 View (即它不支持对 View 的赋值或删除操作)。实现这样的类型可能很容易,但本地实用程序类的激增并不是一件好事。

那么,我的问题是:是否有一种内置的方式来获取这样的“子集 View ”?或者是否有第三方库(最好通过 PyPi 提供)可以很好地实现此类实用程序?

最佳答案

似乎没有内置的方法来获取字典的 View 。最简单的解决方法似乎是 Jochen 的方法。我稍微调整了他的代码以使其适用于我的目的:

from collections import MutableMapping

class DictView(MutableMapping):
def __init__(self, source, valid_keys):
self.source, self.valid_keys = source, valid_keys

def __getitem__(self, key):
if key in self.valid_keys:
return self.source[key]
else:
raise KeyError(key)

def __len__(self):
return len(self.valid_keys)

def __iter__(self):
for key in self.valid_keys:
yield key

def __setitem__(self, key, value):
if key in self.valid_keys:
self.source[key] = value
else:
raise KeyError(key)

def __delitem__(self, key):
self.valid_keys.remove(key)

d = dict(a=1, b=2, c=3)
valid_keys = ['a', 'c']
d2 = DictView(d, valid_keys)
d2['a'] = -1 # overwrite element 'a' in source dictionary
print d # prints {'a': -1, 'c': 3, 'b': 2}

因此 d2 由于不同的 __repr__() 方法,除了打印外,在所有方面都像字典。从 dict 继承以获取 __repr__() 需要重新实现每个方法,就像 collections.OrderedDict 所做的那样。如果只需要一个只读 View ,可以继承 collections.Mapping 并保存 __setitem__()__delitem__() 的实现。我发现 DictView 对于从 self.__dict__ 中选择参数并以紧凑的形式传递它们很有用。

关于Python 创建自己的字典子集的字典 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com