如何将多个键组合成一个值?

2024-04-26 04:29:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于我想编一本词典的问题。我的目标是为一个值设置多个键,如下所示:

dictionary = {('a', 'b'): 1, ('c', 'd'): 2}
assert dictionary['a'] == 1
assert dictionary['b'] == 1

有什么想法吗?


Tags: 目标dictionaryassert词典
3条回答

如果您要经常添加到这个字典中,那么您需要采用基于类的方法,类似于@Latty在这个SO问题中的回答2d-dictionary-with-many-keys-that-will-return-the-same-value

但是,如果您有一个静态字典,并且您只需要通过多个键访问值,那么您就可以走使用两个字典的非常简单的路线。一个用于存储别名密钥关联,另一个用于存储实际数据:

alias = {
    'a': 'id1',
    'b': 'id1',
    'c': 'id2',
    'd': 'id2'
}

dictionary = {
    'id1': 1,
    'id2': 2
}

dictionary[alias['a']]

如果需要添加到词典中,可以编写这样的函数来使用这两个词典:

def add(key, id, value=None)
    if id in dictionary:
        if key in alias:
            # Do nothing
            pass
        else:
            alias[key] = id
    else:
        dictionary[id] = value
        alias[key] = id

add('e', 'id2')
add('f', 'id3', 3)

虽然这是可行的,但我认为如果你想做类似的事情,编写自己的数据结构可能是一条路,尽管它可以使用类似的结构。

如果使用fromkeys,示例将创建多个key:value对。如果不需要,可以使用一个键并为该键创建别名。例如,如果使用寄存器映射,则键可以是寄存器地址,别名可以是寄存器名称。这样就可以在正确的寄存器上执行读/写操作。

>>> mydict = {}
>>> mydict[(1,2)] = [30, 20]
>>> alias1 = (1,2)
>>> print mydict[alias1]
[30, 20]
>>> mydict[(1,3)] = [30, 30]
>>> print mydict
{(1, 2): [30, 20], (1, 3): [30, 30]}
>>> alias1 in mydict
True

我想你是说:

class Value:
    def __init__(self, v=None):
        self.v = v

v1 = Value(1)
v2 = Value(2)

d = {'a': v1, 'b': v1, 'c': v2, 'd': v2}
d['a'].v += 1

d['b'].v == 2 # True
  • Python的字符串和数字是不可变的对象
  • 因此,如果您希望d['a']d['b']指向在其更改时“更新”的同一个值,请使该值引用一个可变的对象(如上面这样的用户定义类,或dictlistset)。
  • 然后,当您在d['a']修改对象时,d['b']会同时更改,因为它们都指向同一个对象。

相关问题 更多 >