2017-03-09 78 views
0

与键在一个词典更换值I有两个字典:在另一字典

dict_1 = {0:[300,650], 1:[420,800], 2:[700,400]} 
dict_2 = {0.0: [[300,650], [895, 111]], 1.0: [[700, 400], [420, 800]], 2.0: [[100, 800], [200, 400]] 

如果dict_1一个值等于在列表中的值中的一个在dict_2然后在dict_2值必须替换为对应于dict_1中的值的KEY。

从上面的字典输出我想要的是:

dict_2 = {0.0: [0, [895, 111]], 1.0: [2, 1], 2.0: [[100, 800], [200, 400]]

这是多远,我已经得到了:

x = 0 
for i in dict_2: 
    for node in dict_1: 
     if dict_2[x][0] == dict_1[x]: 
      dict_2[x][0] = dict_1[???] 
     if dict_2[x][1] == dict_1[x]: 
      dict_2[x][1] = dict_1[???] 
    x+=1 

所有我真的很挣扎在如何调用dict_1的密钥,而不是与密钥dict_1相关联的值 - 显然,我的代码可能更有效。

感谢

+0

你不是已经有一个关键变量'node'中的'dict_1'? – Kendas

+0

@Kendas ahah我失明了。这是真的。 dict_1 [???],应该只是“node”...因为在dictionnarie上迭代和迭代它的键是一样的... – Carele

+0

此外,'dict_1 [x]'是获取值的操作与字典“dict_1”中的_key_“x”相关联。另外,您可以通过在'dict_1.items()中输入'for key'来进行迭代:' – Kendas

回答

3

假设dict_1中的值是唯一的,可以通过将列表转换为元组来将其逆转。然后你可以使用字典理解与嵌套列表理解创造的最终结果:

dict_1 = {0:[300,650], 1:[420,800], 2:[700,400]} 
dict_2 = {0.0: [[300,650], [895, 111]], 1.0: [[700, 400], [420, 800]], 2.0: [[100, 800], [200, 400]]} 

inverse = {tuple(v): k for k, v in dict_1.items()} 
res = {k: [inverse.get(tuple(l), l) for l in v] for k, v in dict_2.items()} 
print(res) 

输出:

{0.0: [0, [895, 111]], 1.0: [2, 1], 2.0: [[100, 800], [200, 400]]} 
+0

即将发布相同的^^ –

0

您可以创建一个逆转dict_1有键而不是值。

dict_1_rev = {v:k for k,v in a.items()} 

这样:

x = 0 
for i in dict_2: 
    for node in dict_1: 
     if dict_2[x][0] == dict_1[x]: 
      dict_2[x][0] = dict_1_rev[dict_1[x]] 
     if dict_2[x][1] == dict_1[x]: 
      dict_2[x][1] = dict_1_rev[dict_1[x]] 
    x+=1 

需要注意的是,如果你在字典一个有重复的值这可不行。密钥对于您的问题必须是唯一的。

尽管如此,让你更有效率。这是另一个问题。

0

这应该工作:

dict_1 = {0:[300,650], 1:[420,800], 2:[700,400]} 
dict_2 = {0.0: [[300,650], [895, 111]], 1.0: [[700, 400], [420, 800]], 2.0: [[100, 800], [200, 400]]} 

for key_2 in dict_2: 
    for key_1 in dict_1: 
     for i in range(0, len(dict_2[key_2])): # In case you change the dimension of dict_2 
      if dict_2[key_2][i] == dict_1[key_1]: 
       dict_2[key_2][i] = key_1