получить значения из dict, ключевые значения которых соответствуют другому dict - PullRequest
0 голосов
/ 28 июня 2018

У меня есть два диктата, которые сами по себе являются ценностями. Я хотел бы создать еще один dict, значения которого - это значения из dict2, которые имеют то же значение ключа «asin», что и dict1. У меня есть пример вывода ниже. Я не слишком много работал с диктовками, поэтому любые советы очень ценятся.

Код:

dict1

{0:[{u’asin’: u’a’, u’h’: u’b’},{u’asin’: u’b’, u’h’: u’c’}], 1:[{u’asin’: u’c’, u’h’: u’b’},{u’asin’: u’d’, u’h’: u’c’}, 2:[{u’asin’: u’d’, u’h’: u’f’},{u’asin’: u’k’, u’h’: u’c’}]}

Код:

dict2

{0:{u’asin’: u’f’, u’img’: u’123’}, 1:{u’asin’: u’c’, u’img’: u’eed’}, 2:{u’asin’: u’d’, u’img’: u’ffg’}}

Желаемый вывод:

{1:{u’asin’: u’c’, u’img’: u’eed’}, 2:{u’asin’: u’d’, u’img’: u’ffg’}}

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы можете использовать несколько понятий: набор значений для извлечения всех ключей из значений d1 и словарь для фильтрации элементов в d2.

.
keys = {subdict['asin'] for item in d1.itervalues() for subdict in item}

d3 = {k: v for k, v in d2.iteritems() if v['asin'] in keys}

print(d3)

{1: {'asin': 'c', 'img': 'eed'}, 2: {'asin': 'd', 'img': 'ffg'}}

В Python 3.x замените itervalues / iteritems на values / items.

0 голосов
/ 28 июня 2018

Вы можете использовать itertools.chain, чтобы объединить все подсписки в dict1, прежде чем использовать понимание списка для фильтрации dict2.

from itertools import chain
dict1 = {0:[{'asin': 'a', 'h': 'b'},{'asin': 'b', 'h': 'c'}], 1:[{'asin': 'c', 'h': 'b'},{'asin': 'd', 'h': 'c'}], 2:[{'asin': 'd', 'h': 'f'},{'asin': 'k', 'h': 'c'}]}
dict2 = {0:{'asin': 'f', 'img': '123'}, 1:{'asin': 'c', 'img': 'eed'}, 2:{'asin': 'd', 'img': 'ffg'}}
r = {d['asin'] for d in chain(*dict1.values())}
print({k: v for k, v in dict2.items() if v['asin'] in r})

Это выводит:

{1: {'asin': 'c', 'img': 'eed'}, 2: {'asin': 'd', 'img': 'ffg'}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...