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