Заменить список значений словаря на основе еще двух словарей - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу заменить список значений в словаре, используя значения двух других словарей.Например, у меня есть словарь с именем «a_dict», для которого каждый ключ имеет значение в виде списка

a_dict = {'A1':[10,20,30,40,50,60,70],'B1':[30,50,60,70,80]}

Теперь мне нужно заменить эти значения в a_dict, который соответствует «old_dict», используя new_dict, как показанониже,

old_dict = {0: 10, 1: 30}

new_dict = {0: 100, 1: 300}

Чтобы новый a_dict был,

a_dict_new = {'A1':[100,20,300,40,50,60,70],'B1':[300,50,60,70,80]}

Я пытался придумать приведенный ниже код, но он не дает мне правильного решения,

a_dict = {'A1':[10,20,30,40,50,60,70],'B1':[30,50,60,70,80]}
old_dict = {0: 10, 1: 30}
new_dict = {0: 100, 1: 300}
#a_dict_new = {'A1':[100,20,300,40,50,60,70],'B1':[300,50,60,70,80]}
a_dict_new = {}
for ky1, val1 in old_dict.items():
    for ky2, ls in a_dict.items():
        new_ls=[]
        for v in ls:
            if (v==val1):
                new_ls.append(new_dict[ky1])
            else:
                new_ls.append(v)
        a_dict_new[ky2]=new_ls
#
print(a_dict_new)

OUTPUT 1: {'A1': [10, 20, 300, 40, 50, 60, 70], 'B1': [300, 50, 60, 70, 80]}

В первой итерации в первом цикле for значение 10 изменяется на 100 в a_dict_new, но во второй итерации оно заменяет первую замену.Следовательно, выходные данные изменяются только на 30 - 300.

Кто-нибудь может предложить эффективный способ сделать эту операцию замены словаря python 3?

1 Ответ

0 голосов
/ 01 февраля 2019

Ваша логика кажется слишком сложной.Вы можете просто создать один словарь сопоставления:

mapper = {old_dict[k]: new_dict[k] for k in old_dict.keys() & new_dict.keys()}
# {10: 100, 30: 300}

Затем использовать его для переназначения значений через словарь:

a_dict_new = {k: [mapper.get(val, val) for val in v] for k, v in a_dict.items()}
# {'A1': [100, 20, 300, 40, 50, 60, 70], 'B1': [300, 50, 60, 70, 80]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...