检查字典键是否包含任何其他字典的键和打印匹配对

时间:2013-07-04 15:20:02

标签: python dictionary key contains key-value

我的问题可能很简单,但是我对许多方法感到困惑,似乎无法在不使用多个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_dictanother_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有剩余条目怎么办?

4 个答案:

答案 0 :(得分:6)

使用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'}

答案 1 :(得分:2)

这对我有用:

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()使代码更具可读性。结合一些更清晰的变量名称,我认为这使得逻辑更容易理解。

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

可以简化我确定。请注意,我认为像name1这样的单词实际上是字符串。

编辑:修改了更改的字符串到变量名称。

答案 2 :(得分: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()

答案 3 :(得分: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()))解决方案是错误的,因为它依赖于具有相同顺序的相同键的字典(而问题表明字典的键可能不同,并且任何字典的键无论如何都是无序的......)。< / p>