gpt4 book ai didi

python - 具有许多将返回相同值的键的 2d 字典

转载 作者:行者123 更新时间:2023-11-28 20:50:04 26 4
gpt4 key购买 nike

我想制作一个每个值有多个键的二维字典。我不想让元组成为关键。而是制作许多将返回相同值的键。

我知道如何使用 defaultdict 制作二维字典:

from collections import defaultdict
a_dict = defaultdict(dict)

a_dict['canned_food']['spam'] = 'delicious'

我可以使用以下方法使元组成为键

a_dict['food','canned_food']['spam'] = 'delicious'

但这不允许我做类似的事情

print a_dict['canned_food']['spam']

因为 'canned_food' 不是键,所以元组 ['food','canned_food'] 是键。

我了解到我可以简单地将许多独立设置为相同的值,例如:

a_dict['food']['spam'] = 'delicious'
a_dict['canned_food']['spam'] = 'delicious'

但是如果有大量的键,这会变得很困惑。在字典的第一维中,每个值需要 ~25 个键。有没有一种方法可以编写字典,使元组中的任何键都起作用?

I have asked this question before但不清楚我想要什么,所以我重新发布。提前感谢您的帮助。

最佳答案

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

from collections import Iterable

class 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_dict
AliasDefaultDict(<class 'dict'>, [(['food', 'canned_food'], {'spam': 'delicious'})])

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

另请注意,此解决方案适用于 3.x,在 2.x 下,您需要将 str 换成 basestringself.aliases。 keys() 用于 self.aliases.viewkeys()

关于python - 具有许多将返回相同值的键的 2d 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13336952/

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