如何在Python中匹配两个词典

时间:2016-02-16 18:56:00

标签: python list dictionary

{u'Orange': [u'OR', u'LI', u'LE'], u'Red': [u'AP', u'ST']}
{u'Orange': [u'ORANGE', u'LIME', u'LEMON'], u'Red': [u'APPLE', u'STRAWBERRY']}

从Python开始,我在使用词典方面遇到了一些困难。我在这里有这两本词典。

我想要的输出是:

Orange: 

Category: Orange
OR - ORANGE
LI - LIME
LE - LEMON

Category: Red
AP - APPLE
ST - STRAWBERRY

不确定我如何匹配这两本词典。我总是可以将它们放入一个字典中并访问其他所有值,但我希望将它们保存为两个字典。永远不会有两个字母代码没有关联值的实例。订单也始终设置。

我的想法是从两者中创建第三本字典,但即便如此,我也不确定该去哪里。

4 个答案:

答案 0 :(得分:3)

您所要做的就是迭代可用密钥,并从两个字典中检索zip列表,以便同时迭代对。

基本实现可能如下所示:

d1 = {u'Orange': [u'OR', u'LI', u'LE'], u'Red': [u'AP', u'ST']}
d2 = {u'Orange': [u'ORANGE', u'LIME', u'LEMON'], u'Red': [u'APPLE', u'STRAWBERRY']}

for k in d1:
    print("Category:", k)
    for abbr, val in zip(d1[k], d2[k]):
        print(abbr, "-", val)
    print()

这将在文本后面的标准输出上打印:

Category: Orange
OR - ORANGE
LI - LIME
LE - LEMON

Category: Red
AP - APPLE
ST - STRAWBERRY

显然,您必须处理一些特殊情况,例如缺少字典中的键等。

答案 1 :(得分:0)

{{1}}

答案 2 :(得分:0)

试试这个:

dict1 = {u'Orange': [u'OR', u'LI', u'LE'], u'Red': [u'AP', u'ST']}
dict2 = {u'Orange': [u'ORANGE', u'LIME', u'LEMON'], u'Red': [u'APPLE', u'STRAWBERRY']}

for color in dict1.keys():
    print("Category: %s" % color)
    print("\n".join(" - ".join((x, y)) for x, y in zip(dict1[color], dict2[color])))
    print()

我不喜欢列表理解。

答案 3 :(得分:0)

取决于你想要做什么之后可以使用字典或只是一个生成器

d1 = {u'Orange': [u'OR', u'LI', u'LE'], u'Red': [u'AP', u'ST']}
d2 = {u'Orange': [u'ORANGE', u'LIME', u'LEMON'], u'Red': [u'APPLE', u'STRAWBERRY']}

new_dict_generator = (zip(d1[k], d2[k]) for k in d1) #Generator
new_dict = {k:zip(d1[k], d2[k]) for k in d1} #Dictionary comprehension

然后你可以像

一样使用它
for pairs in new_dict_generator:
    print(pair)

生成器的优势在于您不需要将整个字典放在内存中,但您无法通过密钥访问它:

>>> new_dict_generator['Orange']
Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: 'generator' object has no attribute '__getitem__'

>>> new_dict['Orange']
[(OR, ORANGE), (LI, LIME), (LE, LEMON)]

编辑:如果在某些时候两个列表的大小不同,您可能需要查看itertools.izip_longest