Подтвердить что ты не робот

Как сделать словарь с несколькими ключами одним значением?

У меня есть вопрос о словаре, который я хочу сделать. Моя цель состоит в том, чтобы иметь несколько ключей для одного значения, например, ниже:

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

Любые идеи?

4b9b3361

Ответ 1

Ваш код работает только:

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

In [2]: mydict
Out[2]: {('a', 'b'): 1, ('c', 'd'): 2}

In [3]: mydict['a', 'b']
Out[3]: 1

In [4]: mydict[('a', 'b')]
Out[4]: 1 

Обратите внимание, что приведенный выше код был выполнен с использованием Python 2.7.8.

Ответ 2

Я думаю, вы имеете в виду это:

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'] указывали на одно и то же значение, которое "обновляется" по мере его изменения, сделайте это значение ссылкой на изменяемый объект (пользовательский класс, например выше, или dict, list, set).
  • Затем, когда вы изменяете объект в d['a'], d['b'] изменяется в одно и то же время, потому что оба они указывают на один и тот же объект.

Ответ 3

В вашем примере создается несколько пар ключ: значение, если используется fromkeys. Если вы этого не хотите, вы можете использовать один ключ и создать псевдоним для ключа. Например, если вы используете карту регистров, ваш ключ может быть адресом регистра, и псевдоним может быть именем регистра. Таким образом, вы можете выполнять операции чтения/записи в правильном регистре.

>>> 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

Ответ 4

Если вы собираетесь добавлять в этот словарь часто, вам нужно использовать подход, основанный на классах, что-то похожее на ответ @Latty в этом вопросе SO 2d-dictionary-with-many-keys-that-will-return-the то же значение

Тем не менее, если у вас есть статический словарь, и вам нужен доступ к значениям только по нескольким ключам, тогда вы можете просто пойти по очень простому пути использования двух словарей. Один для хранения связи с псевдонимом и один для хранения ваших фактических данных:

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)

Хотя это работает, я думаю, что в конечном итоге, если вы захотите сделать что-то подобное, написание собственной структуры данных, вероятно, будет правильным решением, хотя она может использовать аналогичную структуру.

Ответ 5

Это просто. Первое, что вам нужно понять, дизайн интерпретатора Python. Он не выделяет память для всех переменных в основном, если какая-либо из двух или более переменных имеет то же значение, что и для этого значения.

отпустите пример кода,

In [6]: a = 10

In [7]: id(a)
Out[7]: 10914656

In [8]: b = 10

In [9]: id(b)
Out[9]: 10914656

In [10]: c = 11

In [11]: id(c)
Out[11]: 10914688

In [12]: d = 21

In [13]: id(d)
Out[13]: 10915008

In [14]: e = 11

In [15]: id(e)
Out[15]: 10914688

In [16]: e = 21

In [17]: id(e)
Out[17]: 10915008

In [18]: e is d
Out[18]: True
In [19]: e = 30

In [20]: id(e)
Out[20]: 10915296

Из вышесказанного, переменные a и b имеют одну и ту же память, c и d имеют разную память, когда я создаю новую переменную e и сохраняю значение (11), которое уже присутствует в переменной c, поэтому оно сопоставлено с этим памяти и не создает новую память, когда я изменяю значение, присутствующее в переменной e до 21, которое уже присутствует в переменной d, поэтому теперь переменные d и e используют одну и ту же ячейку памяти. Наконец, я изменяю значение в переменной e до 30, которое не сохраняется ни в одной другой переменной, поэтому создает новую память для e.

поэтому любая переменная, имеющая одно и то же значение, разделяет память.

Не для объектов списка и словаря

позвольте прийти к вашему вопросу.

когда несколько ключей имеют одинаковое значение, тогда все они используют одну и ту же память, поэтому ожидаемая вещь уже существует в python.

вы можете просто использовать его так

In [49]: dictionary = {
    ...:     'k1':1,
    ...:     'k2':1,
    ...:     'k3':2,
    ...:     'k4':2}
    ...:     
    ...:     

In [50]: id(dictionary['k1'])
Out[50]: 10914368

In [51]: id(dictionary['k2'])
Out[51]: 10914368

In [52]: id(dictionary['k3'])
Out[52]: 10914400

In [53]: id(dictionary['k4'])
Out[53]: 10914400

Из вышеприведенного вывода ключ k1 и k2 сопоставляется с тем же адресом, который означает значение, которое хранится только один раз в памяти, который является многократным одноразовым словарем, это то, что вы хотите.: P