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

标签 python dictionary python-2.x

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

我知道如何使用 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/

相关文章:

python - 验证损失不随回归中的 MLP 移动

string - 将组件由符号分隔的字符串转换为嵌套的 python 字典

java - NavigableMap 与 SortedMap?

python - 使用哪个三元运算符?

python - 在 Windows 机器上安装 Theano

javascript - 找到正确的纬度和地段

python - 如何在 Django 中获取阿拉伯字符串的 Unicode 表示?

Python 3.4 -> 使用 SQLAlchemy win32 连接到 PostGres SQL

python - 为什么我不能实现 Django 的忘记密码功能?

java - 加入ArrayList的有效方法