【问题标题】:How to compare 2 dictionary of tuples to generate this list of dictionary?如何比较 2 个元组字典以生成此字典列表?
【发布时间】:2014-03-05 10:46:19
【问题描述】:

我有两本词典;

Dict1={'John': ('AA', 'BB'), 'Tom': ('XX', 'YY'), 'Jane': ('AA', 'BB')}

Dict2={'John': ('CC', 'DD', '2'), 'Tom': ('CC', 'DD', '1'), 'Jack': ('CC', 'DD', '3')}

基于这2个列表,我想生成一个看起来像这样的字典;

OutputDict={'John': ('AA', 'BB', '2'), 'Tom': ('XX', 'YY', '1')}

它的工作原理是这样的;

  1. 检查 Dict1 和 Dict2 中的字典是否有匹配的键。
  2. 如果它们有匹配的键,则复制Dict2中元组的第三个元素并粘贴到Dict1中的对应字典中以生成OutputDict。

如何在 Python 中做到这一点?我正在使用 Python2.7。

【问题讨论】:

  • 既然你描述了算法,为什么不给我们展示你尝试过的Python代码呢?

标签: python list python-2.7 dictionary


【解决方案1】:
>>> Dict1={'John': ('AA', 'BB'), 'Tom': ('XX', 'YY'), 'Jane': ('AA', 'BB')}
>>> Dict2={'John': ('CC', 'DD', '2'), 'Tom': ('CC', 'DD', '1'), 'Jack': ('CC', 'DD', '3')}
>>> OutputDict = {}
>>> for k in Dict1:
...     if k in Dict2.keys():
...         OutputDict[k] = tuple(Dict1[k]) + tuple(Dict2[k][2])
... 
>>> OutputDict
{'John': ('AA', 'BB', '2'), 'Tom': ('XX', 'YY', '1')}

【讨论】:

    【解决方案2】:

    一个直接的解决方案看起来像这样,类似于其他答案:

    outputDict = {}
    for k, v in dict1.items():
        if k in dict2:
            result[k] = v + (dict2[k][2],)
    

    由于这个问题相当简单,因此(可以说)更 Pythonic 的方式可以使用 dict 理解而不影响可读性:

    outputDict = {k: v + (dict2[k][2],) for k, v in dict1.items() if k in dict2}
    

    我还建议根据PEP 8 Style Guide 为变量使用小写或驼峰命名,为类名等保留大写。

    【讨论】:

    • 我喜欢pythonic的方式来解决问题。让我陷入困境的是蟒蛇式的方式。
    【解决方案3】:

    有多种方法可以做你想做的事,最简单的一种是:

    OutputDict = {}
    for key in Dict1.iterkeys():
        if key in Dict2:
            OutputDict[key] = Dict1[key] + Dict2[key][2]
    

    由于所有操作都是 O(1),我们为 Dict1(或 Dict2 取决于)上的每个键运行它,所有这些都在 O(min(n,m)) 中运行,其中 n 是 Dict1 的长度,m 是Dict2的长度

    【讨论】:

    • 如果不使用value,为什么要迭代它?也许只是 key in Dict1 会做。此外,您要添加 2,而 OP 想要值中的第二个元素。
    • 为了得到O(min(n,m))的复杂度,不应该先确定两个字典哪个更小吗?这可能是隐含的,但这样做只会添加一行代码(以及其他地方的一些更改),例如 "d1, d2 = sorted([Dict1,Dict2],key=len)"
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多