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



我的问题可能很简单,但我一直对许多方法感到困惑,如果不使用许多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]

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

使用字典理解:

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

这对我有效:

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这样的单词实际上是字符串。

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

你可以使用字典理解,就像一样

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

编辑:

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

您可以使用字典理解:

{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()))解决方案是错误的,因为它依赖于具有相同顺序的相同关键字的字典(而问题指出字典的关键字可能不同,并且任何字典的关键字都是无序的…)。

相关内容

最新更新