我收到一个字典作为输入,并想返回一个字典,其键将是输入的值,而键的值将是对应的输入键。价值观是独一无二的。
例如,说我的输入是:
a = dict()
a['one']=1
a['two']=2
我希望我的输出是:
{1: 'one', 2: 'two'}
为了澄清,我希望我的结果等于以下内容:
res = dict()
res[1] = 'one'
res[2] = 'two'
有什么精巧的Pythonic方式可以做到这一点?
我收到一个字典作为输入,并想返回一个字典,其键将是输入的值,而键的值将是对应的输入键。价值观是独一无二的。
例如,说我的输入是:
a = dict()
a['one']=1
a['two']=2
我希望我的输出是:
{1: 'one', 2: 'two'}
为了澄清,我希望我的结果等于以下内容:
res = dict()
res[1] = 'one'
res[2] = 'two'
有什么精巧的Pythonic方式可以做到这一点?
Answers:
Python 2:
res = dict((v,k) for k,v in a.iteritems())
Python 3(感谢@erik):
res = dict((v,k) for k,v in a.items())
[
和]
。列表解析不需要[
和]
吗?
new_dict = dict(zip(my_dict.values(), my_dict.keys()))
In [1]: my_dict = {'x':1, 'y':2, 'z':3}
In [2]: dict((value, key) for key, value in my_dict.iteritems())
Out[2]: {1: 'x', 2: 'y', 3: 'z'}
您可以尝试:
d={'one':1,'two':2}
d2=dict((value,key) for key,value in d.iteritems())
d2
{'two': 2, 'one': 1}
注意,如果出现以下情况,您将无法“撤消”字典
{'one':1,'two':1}
。新字典只能有一个带有key的项目1
。{'one':[1]}
。[1]
是有效值,但不是有效键。res = dict(zip(a.values(), a.keys()))
当前的主要答案假设值是唯一的,但并非总是如此。如果值不是唯一的怎么办?您将失去信息!例如:
d = {'a':3, 'b': 2, 'c': 2}
{v:k for k,v in d.iteritems()}
返回{2: 'b', 3: 'a'}
。
有关的信息'c'
被完全忽略。理想情况下应该是这样的{2: ['b','c'], 3: ['a']}
。这就是最底层的实现。
def reverse_non_unique_mapping(d):
dinv = {}
for k, v in d.iteritems():
if v in dinv:
dinv[v].append(k)
else:
dinv[v] = [k]
return dinv
def reverse_non_unique_mapping(d):
dinv = {}
for k, v in d.items():
if v in dinv:
dinv[v].append(k)
else:
dinv[v] = [k]
return dinv
扩展Ilya Prokin响应的另一种方法是实际使用该reversed
功能。
dict(map(reversed, my_dict.items()))
本质上,您的字典通过(使用.items()
)进行迭代,其中每个项目都是键/值对,并且这些项目与reversed
函数交换。当将其传递给dict
构造函数时,它将把它们变成您想要的值/键对。
dict(map(lambda x: x[::-1], YourDict.items()))
.items()
返回的元组列表(key, value)
。map()
遍历列表中的元素并应用于lambda x:[::-1]
其每个元素(元组)以将其反转,因此每个元组都将(value, key)
在新列表中分散在地图之外。最后,dict()
从新列表中做出决定。
lambda x:[::-1]
各个元素,并将其应用于每个元素(元组)以将其反转,因此每个元组都将成为新列表(从地图上分割出来)中的(值,键)。最后,dict()从新列表中做出字典。
使用循环:-
newdict = {} #Will contain reversed key:value pairs.
for key, value in zip(my_dict.keys(), my_dict.values()):
# Operations on key/value can also be performed.
newdict[value] = key