【问题标题】:Refactoring with python dictionary comprehension用 python 字典理解重构
【发布时间】:2012-07-04 01:00:05
【问题描述】:

我有 2 个包含相同键但值对不同的字典。让我们让 dictA 和 dictB 代表有问题的两个字典。

dictA = {'key1':'Joe', 'key2':'Bob'}
dictB = {'key1':'Smith', 'key2':'Johnson'}

目前,我正在通过嵌套的 if 语句创建一个基于常见键的新字典。这样做时,共享键的值包含在新字典的列表中。请参阅下面的操作:

dictAB = {}  # Create a new dictionary

# Create a list container for dictionary values
for key in dictA.keys():
    dictAB[key] = []

# Iterate through keys in both dictionaries
# Find matching keys and append the respective values to the list container
for key, value in dictA.iteritems():
    for key2, value2 in dictB.iteritems():
        if key == key2:
            dictAB[key].append(value)
            dictAB[key].append(value2)
        else:
            pass

如何使用 python 字典理解把它变成一个更干净的结构?

【问题讨论】:

    标签: python refactoring dictionary-comprehension


    【解决方案1】:

    使用集合或key views (python 2.7):

    dictAB = {k: [dictA[k], dictB[k]] for k in dictA.viewkeys() & dictB.viewkeys()}
    

    2.7 之前:

    dictAB = dict((k, [dictA[k], dictB[k]]) for k in set(dictA) & set(dictB))
    

    在 python 3 中,您可以直接使用.keys 方法进行此类操作,因为它们是作为视图实现的:

    dictAB = {k: [dictA[k], dictB[k]] for k in dictA.keys() & dictB.keys()}
    

    演示(python 2.7):

    >>> dictA = {'key1':'Joe', 'key2':'Bob'}
    >>> dictB = {'key1':'Smith', 'key2':'Johnson'}
    >>> dictAB = {k: [dictA[k], dictB[k]] for k in dictA.viewkeys() & dictB.viewkeys()}
    >>> print dictAB
    {'key2': ['Bob', 'Johnson'], 'key1': ['Joe', 'Smith']}
    

    两个集合或字典视图上的& 运算符创建两个集合的交集;两个集合中都存在的所有键。

    通过使用键的交集,即使 dictA 或 dictB 具有未出现在其他字典中的键,此代码也将起作用。如果您绝对确定键将始终匹配,则可以直接迭代任一 dict 而无需交集:

    dictAB = {k: [dictA[k], dictB[k]] for k in dictA}
    

    【讨论】:

    • 因为dictAdictB 无论如何都有相同的键,所以没有必要构造交集。一个简单的for k in dictA 就可以了。
    • 为了防御,我会添加一个调试断言:assert dictA.viewkeys() == dictB.viewkeys()。这样,生产代码的速度不受影响。
    【解决方案2】:
    dictAB = { key: [dictA[key],dictB[key]] for key in dictA if key in dictB }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      • 2022-11-22
      • 2017-04-24
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      相关资源
      最近更新 更多