условное добавление словарных статей из второго словаря в новый словарь при сохранении новых словарных ключей - PullRequest
1 голос
/ 06 февраля 2020

У меня есть два дикта - dict1 = {'a':'value','b':'value','d':'value'} и dict2 = {'p':'blank','q':'blank','r':'blank','s':'blank'}. Их ключи хранятся в двух списках - list1 = ['a','b','c','d'] и list2 = ['p','q','r','s']. dict1 не всегда может содержать все пары ключ: значение.

Я хочу добавить записи от dict1 до dict2, , если в dict1 else * 1013 существуют ключи * Я хочу "пусто"

Я написал этот код:

for i in list1:
    if i in dict1.keys():
        dict2[i] = dict1[i]
    else:
        dict2[i] = "blank"

Это даст мне dict2 с ключами от list1. Как я могу изменить этот код, чтобы сохранить условия, но сохранить ключи, связанные с dict2, то есть ['p','q','r','s']? Мой желаемый вывод

dict2 = {'p':1,'q':2,'r':'blank','s':4}

Количество клавиш всегда будет одинаковым в двух диктовках.

Кроме того, есть ли еще Pythoni c способ сделай это? Я видел некоторые ответы здесь , но не понял полностью.

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Так что, если я правильно понимаю, вы хотите "сопоставить" ключи list1 с ключами list2? В этом случае вы можете zip два списка перебрать два списка по порядку, а затем оставить остальную часть кода одинаковой. Одно небольшое улучшение заключается в том, что i in dict1.keys() фактически совпадает с i in dict1.

for i, j in zip(list1, list2):
    if i in dict1:
        dict2[j] = dict1[i]
    else:
        dict2[j] = "blank"
0 голосов
/ 06 февраля 2020

Если я вас правильно понимаю, вы хотите обновить dict2, если элемент в list1 находится в dict1, используя соответствующий ключ в list2.

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

dict1 = {'a':1,'b':2,'d':4}
dict2 = {'p':'blank','q':'blank','r':'blank','s':'blank'}
list1 = ['a','b','c','d']
list2 = ['p','q','r','s']

for a, b in zip(list1, list2):
    dict2[b] = dict1[a] if a in dict1 else 'blank'

print(dict2)

Вывод:

{'p': 1, 'q': 2, 'r': 'blank', 's': 4}

В качестве альтернативы вы можете использовать метод словаря update() и обновить все значения в одну строку:

dict2.update({b : dict1[a] if a in dict1 else 'blank' for a,b in zip(list1, list2)})

update() занимает словарь предметов. В строке выше вы создаете временный словарь с пониманием словаря и обновляете dict2.

...