【问题标题】:How to match up two dictionaries in Python如何在 Python 中匹配两个字典
【发布时间】:2016-02-16 18:55:59
【问题描述】:
{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

不确定我将如何匹配这两个词典。我总是可以将它们放入一个字典并访问其他所有值,但我想将它们保留为两个字典。永远不会出现两个字母代码没有关联值的情况。顺序也总是设置好的。

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

【问题讨论】:

  • 一开始孤单的Orange: 是怎么回事?
  • 他们匹配得这么好吗?如果列表甚至像这样的顺序相同,您可以zip它们,但是如果它们没有像这样完全镜像(不同大小的列表,不完全相同的键,不同顺序的列表,任何其他问题的数量)。
  • @Bhargav Rao 孤独的橙子:一开始是我打印字典的时候,我认为这是关键。
  • @Two-Bit Alchemist 它们应该总是匹配得很好,因为字典是通过从 excel 表中绘制值来创建的。
  • @RottenLettuce 很高兴您得到了一个可以接受的答案,但值得一提的是:如果您自己提取数据,最好“正确”(以您想要的格式)提取数据,同时您正在提取它,而不是稍后返回并尝试修复它。如果你无法控制,那就是另一回事了。

标签: python list dictionary


【解决方案1】:

您所要做的就是迭代可用的键,然后从两个字典中检索到 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

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

【讨论】:

    【解决方案2】:
    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,abbrevs in d1.items():
        print("Category:", k)
        for abb, name in zip(abbrevs, d2[k]):
            print("{} - {}".format(abbrev, name))
    

    【讨论】:

      【解决方案3】:

      试试这个:

      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()
      

      我不喜欢列表理解吗?

      【讨论】:

        【解决方案4】:

        根据你想做什么之后可以使用字典或只是一个生成器

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多