我有两个格言,他们的价值观本身就是格言。我想创建另一个dict,其值是dict2中的值与dict1相同的“ asin”键值。我在下面有示例输出。我对字典的了解不多,因此非常感谢所有提示。
代码:
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’}}
答案 0 :(得分:2)
您可以使用以下几种理解:集合理解从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
。
答案 1 :(得分:1)
您可以先使用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'}}