Python:如何将列表中的值映射到相关的字典键

Python:如何将列表中的值映射到相关的字典键,python,list,dictionary,Python,List,Dictionary,我有一个带有这个键和值对的字典dic:注意:这个dic是双射的,即:一对一映射 dic = { 0: 0, 30: 1, 35: 2, 42: 3, 53: 4, 54: 5, 55: 6, 81: 7, 83: 8, 95: 9, 99: 10 } 在我的源代码中,有一个由特定计算生成的列表L。L中的值实际上与dic值关联。因此,基于dic,我想要这个L列表: 从dic转换为键值。这是

我有一个带有这个键和值对的字典dic:注意:这个dic是双射的,即:一对一映射

dic = {
    0: 0, 
    30: 1, 
    35: 2, 
    42: 3, 
    53: 4, 
    54: 5, 
    55: 6, 
    81: 7, 
    83: 8, 
    95: 9, 
    99: 10
}
在我的源代码中,有一个由特定计算生成的列表L。L中的值实际上与dic值关联。因此,基于dic,我想要这个L列表:

从dic转换为键值。这是所需的输出:


我可以使用什么样的列表理解来获得所需的输出?

您可以从原始词典创建反向词典,并使用它来获得所需的结果,如下所示:

dic = {0: 0, 
30: 1, 
35: 2, 
42: 3, 
53: 4, 
54: 5, 
55: 6, 
81: 7, 
83: 8, 
95: 9, 
99: 10}

invertedDic = {v:k  for k, v in dic.items()}
L = [0, 0, 7, 2, 2, 1, 9]
res = [invertedDic[elt] for elt in L]
print(res)
输出:

[0, 0, 81, 35, 35, 30, 95]

此外,不建议使用dict等关键字作为对象名称。

您可以从原始字典创建反向字典,并使用该字典获得所需结果,如下所示:

dic = {0: 0, 
30: 1, 
35: 2, 
42: 3, 
53: 4, 
54: 5, 
55: 6, 
81: 7, 
83: 8, 
95: 9, 
99: 10}

invertedDic = {v:k  for k, v in dic.items()}
L = [0, 0, 7, 2, 2, 1, 9]
res = [invertedDic[elt] for elt in L]
print(res)
输出:

[0, 0, 81, 35, 35, 30, 95]

此外,不建议将dict等关键字用于对象名称。

还有另一种解决方案,它不需要生成值和键切换的中间字典。它与@Krishna Chaurasia提出的解决方案一步到位。限制是相同的,特别是您必须确保dic在其他地方是双射的,这样才能工作

dic = {
    0: 0, 
    30: 1, 
    35: 2, 
    42: 3, 
    53: 4, 
    54: 5, 
    55: 6, 
    81: 7, 
    83: 8, 
    95: 9, 
    99: 10
}

L = [0, 0, 7, 2, 2, 1, 9]

out = [k for el in L for k,v in dic.items() if el==v]
输出


还有另一种解决方案,它不需要生成值和键切换的中间字典。它与@Krishna Chaurasia提出的解决方案一步到位。限制是相同的,特别是您必须确保dic在其他地方是双射的,这样才能工作

dic = {
    0: 0, 
    30: 1, 
    35: 2, 
    42: 3, 
    53: 4, 
    54: 5, 
    55: 6, 
    81: 7, 
    83: 8, 
    95: 9, 
    99: 10
}

L = [0, 0, 7, 2, 2, 1, 9]

out = [k for el in L for k,v in dic.items() if el==v]
输出


不过,这是一个习惯用语,也是一个警告。如果两个键共享相同的值,它将静默地使用最后找到的键作为值。如果dict不是双射的,那么使用显式循环可以确保捕捉到这种情况并抛出错误。elt表示正在迭代的列表元素。最好直接使用lst中的elt,而不是rangelenlst中的i:printlst[i]。第一种情况下的elt是第二种情况下列表[i]的表示。@DionisiusPratama当然,它在给定的情况下会起作用,但我只想指出,将其用作dict的一般反转可能会很危险,并可能导致令人惊讶的结果。它很好地回答了前面提到的问题,因此我对它投了赞成票。我同意@JanChristofterasa的观点,指出这一限制是很好的,这样其他有类似问题的人就不会在不知道限制的情况下直接使用代码。另请参阅,了解更多关于如何处理非双射情况的想法。这是一种习惯用法,不过,还是要小心一点。如果两个键共享相同的值,它将静默地使用最后找到的键作为值。如果dict不是双射的,那么使用显式循环可以确保捕捉到这种情况并抛出错误。elt表示正在迭代的列表元素。最好直接使用lst中的elt,而不是rangelenlst中的i:printlst[i]。第一种情况下的elt是第二种情况下列表[i]的表示。@DionisiusPratama当然,它在给定的情况下会起作用,但我只想指出,将其用作dict的一般反转可能会很危险,并可能导致令人惊讶的结果。它很好地回答了前面提到的问题,因此我对它投了赞成票。我同意@JanChristofterasa的观点,指出这个限制是好的,这样其他有类似问题的人就不会在不知道限制的情况下直接使用代码。有关如何处理非双射情况的更多想法,请参阅。