Как извлечь значения словаря, используя несколько ключей одновременно - PullRequest
0 голосов
/ 28 марта 2019

У меня проблема ниже.

dict1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

Обычный метод поиска: dict1['a'] -> Вывод -> 1
ожидаемый метод: dict1['a', 'b'] -> Вывод -> [1, 2]

Мое требование состоит в том, чтобы извлечь несколько значений из словаря, указав несколько ключей одновременно, как указано выше в ожидаемом методе.

Есть ли способ сделать это? Если мне нужно отредактировать встроенные методы класса dict, как мне это сделать?

Ответы [ 4 ]

1 голос
/ 28 марта 2019

Вы можете использовать понимание списка: [dict1[key] for key in ('a', 'b')]

Это эквивалентно

output = []
for key in ('a', 'b'):
    output.append(dict1[key])
0 голосов
/ 03 апреля 2019

Это один из способов сделать это с помощью подклассов:

class CustomDict(dict):
    def __init__(self, dic):
        self.dic = dic

    def __getitem__(self, items):
        values = []
        for item in items:
            values.append(self.dic[item])
        return values if len(values) > 1 else values[0]


d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

new_d = CustomDict(d)

print(new_d['a'])
print(new_d['a', 'b'])
print(new_d['a', 'b', 'c'])
print(new_d['a', 'c', 'd'])

Вывод:

1
[1, 2]
[1, 2, 3]
[1, 3, 4]

Объяснение:

new_d является объектом класса CustomDict, он всегда будет прибегать к методам родительского класса (так что циклически перебирая объект и другие вещи, которые вы можете захотеть сделать для работы со словарем), за исключением случаев, когда один из переопределенных методов (init, getitem) вызывается.

Так что, когда используется new_d['a', 'b'], вызывается переопределенный метод __getitem__.Переопределенный метод использует __getitem__ из self.dic (который является обычным словарем) для фактического доступа к значениям словаря для каждого заданного ключа.

0 голосов
/ 28 марта 2019

Использовать понимание списка:

[ dict[k] for k in ('a','b')]
[ dict[k] for k in my_iterable ]

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

[ dict.get(k, my_default_value) for k in my_iterable ]
0 голосов
/ 28 марта 2019

Вы можете сделать то, что сказано в других ответах, или использовать map в своем списке ключей с помощью get словарного метода:

map(dict1.get, ["a", "b"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...