Игнорирование части ключевого словаря python - PullRequest
0 голосов
/ 01 сентября 2018

Я хочу иметь словарь, в котором ключи являются кортежами, такими как (1, 0). Однако я хочу, чтобы все ключи формы (n, 0) идентифицировались с похожим выводом, и было бы неплохо, если бы мне не пришлось иметь все кортежи от (1, 0) до (n, 0) как ключи в моем словаре. Есть ли простой способ сделать это?

dictionary = {(n, 1): [n, 3], (n, 2): [5, n], (n, 0): [0, n]}

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Просто скопируйте значение (1,0) в (n, 0) и затем удалите элемент (1,0) из dict. Как это:

dictionary[n,0] = dictionary[1,0]
del dictionary[1,0]

и т. Д. Но для определения аналогичных выходных данных вы должны преобразовать значение в кортеж с помощью set (), а затем взять разницу с ключом. Как это:

 for key in dictionary:
    if set(key) - set(dictionary[key]) is set():
       print("Similar key value pair")
0 голосов
/ 01 сентября 2018

Если вы хотите создать dict со специальным правилом для обработки ключей, которые на самом деле не хранятся в хэш-таблице dict, вы хотите создать подкласс dict, который реализует __missing__ :

Вызывается dict.__getitem__() для реализации self[key] для dict подклассов, когда ключ отсутствует в словаре.

Как это:

class SpecialDict(dict):
    def __missing__(self, key):
        if isinstance(key, tuple) and len(key) == 2 and key[1] == 0:
            return [0, key]
        raise KeyError(key)

Я не очень понимаю, как должен работать ваш пример, поэтому вот другой пример, чтобы продемонстрировать это:

>>> d = SpecialDict({(1, 1): [2, 3], (1, 2): [5, 4]})
>>> d[1, 1]
[2, 3]
>>> d[2, 2]
KeyError: (2, 2)
>>> d[20, 0]
[0, 20]

Если вы сохраните значение для ключа (n, 0), он не будет вызывать __missing__ для этого ключа, что позволит вам переопределить один (n, 0), оставляя остальные с их специальным правилом:

>>> d[42, 0] = [23, 23]
>>> d[42, 0]
[23, 23]
>>> d[23, 0]
[0, 23]
...