栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有许多键的2d词典将返回相同的值

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有许多键的2d词典将返回相同的值

这是一个可能的解决方案:

from collections import Iterableclass AliasDefaultDict():    def __init__(self, default_factory, initial=[]):        self.aliases = {}        self.data = {}        self.factory = default_factory        for aliases, value in initial: self[aliases] = value    @staticmethod    def distinguish_keys(key):        if isinstance(key, Iterable) and not isinstance(key, str): return set(key)        else: return {key}    def __getitem__(self, key):        keys = self.distinguish_keys(key)        if keys & self.aliases.keys(): return self.data[self.aliases[keys.pop()]]        else: value = self.factory() self[keys] = value return value    def __setitem__(self, key, value):        keys = self.distinguish_keys(key)        if keys & self.aliases.keys(): self.data[self.aliases[keys.pop()]] = value        else: new_key = object() self.data[new_key] = value for key in keys:     self.aliases[key] = new_key return value    def __repr__(self):        representation = defaultdict(list)        for alias, value in self.aliases.items(): representation[value].append(alias)        return "AliasDefaultDict({}, {})".format(repr(self.factory), repr([(aliases, self.data[value]) for value, aliases in representation.items()]))

可以这样使用:

>>> a_dict = AliasDefaultDict(dict)>>> a_dict['food', 'canned_food']['spam'] = 'delicious'>>> a_dict['food']{'spam': 'delicious'}>>> a_dict['canned_food']{'spam': 'delicious'}>> a_dictAliasDefaultDict(<class 'dict'>, [(['food', 'canned_food'], {'spam': 'delicious'})])

请注意,有些边缘情况具有未定义的行为-
例如对多个别名使用相同的键。我觉得这使得该数据类型对于一般用途而言非常糟糕,我建议您最好更改程序,而不需要这种过度复杂的结构。

还要注意该解决方案是3.x中,在2.x中,你将要交换出去

str
basestring
,并
self.aliases.keys()
self.aliases.viewkeys()



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648468.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号