不要按键读取字典,而是按值读取(mydict[key] = value >>> mydict[value] = key)

3

这个问题听起来可能有些奇怪,但通常您可以通过键获取值,例如:

>>> mydict = {'a':1,'b':2,'c':3}
>>> mydict['a']
1
>>> mydict['b']
2
>>> mydict['c']
3

但是我需要做的是:
>>> mydict[1]
'a'
>>> mydict[2]
'b'
>>> mydict[3]
'c'
# In this case, my dictionary have to work like
>>> mydict = {1:'a',2:'b',3:'c'}

在我的程序中,打开字典有两种方式,也就是说:
>>> mydict = {'a':1,'b':2,'c':3}
# Sometimes I need the value of a letter:
>>> mydict['a']
1
# And somethimes, I need the letter of a value.
>>> mydict.REVERSAL[1]
a

我可以做类似于以下内容的事情:(我不知道这是否有效,因为我还没有测试过)
>>> mydict = {'a':1,'b':2,'c':3}
>>> mydict['a']
1
# etc...
>>> def reversal(z):
...     tmp = {}
...     for x,y in z.items():
...         tmp[y] = x
...     return tmp
>>> mydict = reversal(mydict)
>>> mydict[1]
a
# etc
>>> mydict = reversal(mydict)
>>> mydict['c']
3
# etc, etc, etc...

有没有简单的方法来做到这一点?
首先:我知道chr()和ord(),但我的代码不是关于字母的……这只是一个例子。
其次:在我的字典中不会有两个相同的值,因此不会出现重复键的问题……


Python中如何反转转换字典的键和值? - Priyesh Kumar
1
只有两个字典,d{v:k for k,v in d.items()} - Chris_Rands
3个回答

2
你需要类似这样的东西:
In [21]: mydict = {'a':1,'b':2,'c':3}
In [22]: dict(zip(mydict.values(),mydict.keys()))
Out[22]: {1: 'a', 2: 'b', 3: 'c'}

或者

In [23]: dict(i[::-1] for i in mydict.items())
Out[23]: {1: 'a', 2: 'b', 3: 'c'}

或者

In [24]: dict(map(lambda x:x[::-1],mydict.items()))
Out[24]: {1: 'a', 2: 'b', 3: 'c'}

其他答案使用 {b:a for a, b in mydict.keys()} 代替你的代码,有什么区别? - Ender Look
区别在于我使用了dict方法将元组列表转换为字典。 - Rahul K P
抱歉,我不理解。您是要将字典转换为元组,反转键和值,然后再将元组转换回字典吗?这种方法是否性能友好? - Ender Look
dict([(1,'a'),(2,'b'),(3,'c')]) 这将是模板。 - Rahul K P
谢谢你的帮助,但我会接受另一个更简单的答案(我会给你点赞)。 - Ender Look

1
要反转字典,您可以使用.items():
mydict = {'a':1,'b':2,'c':3}

new_dict = {b:a for a, b in mydict.items()}

谢谢你提供这行代码!但是你的代码有一个错误,把.keys()改成.items()就可以修复它。谢谢,但是我有一个问题,这是列表推导式吗? - Ender Look
谢谢您指出错误!这实际上是字典推导。 - Ajax1234

1
你可以使用字典推导式来交换键和值:
>>> mydict = {'a': 1, 'b': 2, 'c': 3}
>>> reversal = {v: k for k, v in mydict.items()}
>>> reversal[1]
'a'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接