【问题标题】:Check if dictionary key contains any of another dictionary's keys and print matching pairs检查字典键是否包含任何另一个字典的键并打印匹配对
【发布时间】:2013-07-02 15:57:20
【问题描述】:

我的问题可能很简单,但是我一直在对多种方法感到困惑,如果不使用许多 for 循环似乎无法找到有效的答案。

我有一本字典:

my_dict = {'full_name1' : 1, 
           'full_name2' : 2,
           'full_name3' : 3}

我也有这本词典:

another_dict = {'name1' : 'x', 
                'name2' : 'y',
                'name3' : 'z'}

我想要生成第三个字典,如下所示:

third_dict = {1 : 'x', 
              2 : 'y',
              3 : 'z'}

my_dict 的值是third_dict 中对应another_dict 值的键。这对我来说很容易,只是前两个字典的键名不相同。我假设another_dict 中的键名将始终是my_dict 中的一部分,但并非my_dict 中的所有键都会在another_dict 中具有匹配的键。

我目前的、错误的、低效的方法:

    third_dict={}

    for key in my_dict:
        for sub_key in another_dict:
            if sub_key in key:
                for key in my_dict:
                    third_dict[my_dict[key]] = another_dict[sub_key]

编辑:正如建议的那样,看看如何处理异常会很有趣。例如,如果 another_dict 有一个条目,它与 my_dict 中的条目不匹配,反之亦然?或者如果 another_dict 有多余的条目怎么办?

【问题讨论】:

  • dict(zip(my_dict.values(), another_dict.values()))
  • 有趣的问题。但有趣的部分涉及如何处理不匹配和多余的匹配。例如: (A) 如果another_dict 有一个name4 键(不匹配)会发生什么。 (B) 如果my_dict 也有一个total_name2 键(多余的匹配项)会发生什么。也许您可以编辑您的问题以澄清这些问题。
  • 在提供的任何答案中均未引发异常。字典理解是使用条件构造的,所以for every partial_key in dict2 for every full_key in dict1 if partial_key in full_key 简单地迭代dict1dict2 中的键,检查partial_key 是否是full_key 的一部分,如果条件不成立,继续前进而不包括理解中的值。

标签: python dictionary key contains key-value


【解决方案1】:

你可以使用dictionary comprehensions:

{dict1[full_key]:dict2[partial_key] for full_key    in dict1
                                    for partial_key in dict2
                                    if  partial_key in full_key}

编辑

.items().iteritems() 的解决方案非常相似,但是这个解决方案不会加载甚至绑定不必要的值,并且更具可读性。 dict(zip(dict1.values(),dict2.values())) 解决方案是错误的,因为它取决于字典具有相同的键以相同的顺序(而问题表明字典的键可能不同,并且任何字典的键无论如何都是无序的......)。

【讨论】:

    【解决方案2】:

    你可以使用 dictionary comprehension ,所以喜欢

    >>> my_dict = {'full_name1' : 1,
    ...            'full_name2' : 2,
    ...            'full_name3' : 3}
    >>> 
    >>> another_dict = {'name1' : 'x',
    ...                 'name2' : 'y',
    ...                 'name3' : 'z'}
    >>> { y:j for x,y in my_dict.items() for i,j in another_dict.items() if i in x }
    
    {1: 'x', 2: 'y', 3: 'z'}
    

    编辑:

    如果您想要一个迭代器而不是加载所有项目,您可以按照 InbarRose 的建议使用 dict.iteritems() 而不是 dict.items()

    【讨论】:

    • 您应该使用iteritems() 而不是items(),这样它就不会将所有项目加载到内存中。
    • @InbarRose 我不知道字典可以返回迭代器。太棒了。
    • 我的荣幸。我很惊讶你不知道,因为你的答案和我的几乎一样——我以为你对字典有更好的理解。
    【解决方案3】:

    这对我有用:

    full_name1 = 'Will Smith'
    full_name2 = 'Matt Damon'
    full_name3 = 'Mark yMark'
    
    name1 = 'Will'
    name2 = 'Matt'
    name3 = 'Mark'
    
    my_dict = {full_name1 : 1,
               full_name2 : 2,
               full_name3 : 3}
    
    another_dict = {name1 : 'x',
                    name2 : 'y',
                    name3 : 'z'}
    
    result = {}
    for sub, val in another_dict.items():   # start with the substrings
        for string, key in my_dict.items():
            if sub in string:
                result[key]=val
    
    print(result)
    

    我使用dict.items() 使代码更具可读性。结合一些更清晰的变量名,我认为这使得逻辑更容易理解。

    文档:http://docs.python.org/2/library/stdtypes.html#dict.items

    我敢肯定,可以简化。请注意,我假设您像 name1 这样的词实际上是字符串。

    编辑:将更改的字符串修复为变量名。

    【讨论】:

    • namexfull_namex 是变量而不是字符串。他想检查namexfull_namex 是否具有相同的值,而不是相同的名称。
    • 好吧,我不是很清楚。请注意,如果 namefull_name包含字符串的变量,则代码的工作方式完全相同。
    • @enginefree 我编辑了这个问题来解决这个问题。为我的错误道歉,它们是字符串,而不是变量。另外,按照 FMc 的建议,我再次编辑了问题以包含错误处理能力
    【解决方案4】:

    使用dictionary comprehension:

    >>> my_dict = {'full_name1' : 1, 'full_name2' : 2, 'full_name3' : 3}
    >>> another_dict = {'name1' : 'x', 'name2' : 'y', 'name3' : 'z'}
    >>> {key:value for S, key in my_dict.iteritems() for s, value in another_dict.iteritems() if s in S}
    {1: 'x', 2: 'y', 3: 'z'}
    

    【讨论】:

    • 如果这对你有帮助,你可以Accept my Answer
    • 按照@FMc 的建议,我编辑了问题以查看如何处理异常。我赞成你的答案,因为它是最简洁和准确的。也许您可以对其进行编辑以包含异常处理功能?
    • @user1083734 as Dan Gittik said 无需处理Exceptions,因为不会发生,但是 - 需要指定你想在这些条件下发生什么?如果名称重复,则仅使用最新的(最后被迭代的)值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2015-11-12
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多