3

我的问题可能很简单,但是我一直对多种方法感到困惑,如果不使用许多 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键。这对我来说很容易,只是前两个字典的键名不相同。我假设 in 中的键名将始终是 in 中的一部分,但并非所有 in 中的键都有匹配的键 in 。third_dictanother_dictanother_dictmy_dictmy_dictanother_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

4 回答 4

6

使用字典理解

>>> 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'}
于 2013-07-04T15:34:23.340 回答
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()使代码更具可读性。结合一些更清晰的变量名称,我认为这使得逻辑更容易理解。

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

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

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

于 2013-07-04T15:30:01.307 回答
2

你可以使用字典理解,所以喜欢

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

编辑:

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

于 2013-07-04T15:35:11.920 回答
1

您可以使用字典推导

{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())),因为它取决于字典具有相同顺序的相同键(而问题表明字典的键可能不同,并且任何字典的键无论如何都是无序的......)。

于 2013-07-04T15:52:57.353 回答