Сопоставить словарь с другим словарем - PullRequest
0 голосов
/ 05 апреля 2019

Я почти уверен, что мне не хватает чего-то действительно базового, но есть ли способ сопоставить словарь с другим?

Например, для словаря, подобного этому:

d = {'a': {'b': 'r1', 'c': 'r2'}, 'v': {'x': 'r4', 'o': 'r2'}}

И используйте маппер так:

mapper = {'a': 0, 'b': 1, 'c': 2, 'v': 3, 'x': 4, 'o': 5}

Ожидаемый результат должен быть таким:

result = {0: {1: 'r1', 2: 'r2'}, 3: {4: 'r4', 5: 'r2'}}

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Это не рекурсивно, поэтому работает только для аналогичного ввода (если вы в порядке):

d = {'a': {'b': 'r1', 'c': 'r2'}, 'v': {'x': 'r4', 'o': 'r2'}}
mapper = {'a': 0, 'b': 1, 'c': 2, 'v': 3, 'x': 4, 'o': 5}

res = {}
for k, v in d.items():
    res.update({mapper[k]: {mapper[x]: y for x, y in v.items()}})

print(res)
# {0: {1: 'r1', 2: 'r2'}, 3: {4: 'r4', 5: 'r2'}}

Короче :

res = {mapper[k]: {mapper[x]: y for x, y in v.items()} for k, v in d.items()}
0 голосов
/ 05 апреля 2019

Вы можете использовать функцию, которая рекурсивно заменяет ключи соответствующими значениями в поле ввода карт:

def map_keys(d, m):
    return {m[k]: map_keys(v, m) for k, v in d.items()} if isinstance(d, dict) else d

, так что map_keys(d, mapper) возвращает:

{0: {1: 'r1', 2: 'r2'}, 3: {4: 'r4', 5: 'r2'}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...