Python:修改dict以使键成为值,将值作为键

时间:2011-07-21 13:32:00

标签: python

假设我有一个字典dict,具有以下值:

dict1 = {'1': ['a','b', 'c', 'd'], '2': ['e','f', 'g', 'h']}

如何将其中一个值作为新词典中的键,dict1?

dict2 = {'d': ['a','b', 'c', '1'], 'h': ['e','f', 'g', '2']}

3 个答案:

答案 0 :(得分:7)

In [12]: d = {'1': ['a','b', 'c', 'd'], '2': ['e','f', 'g', 'h']}

In [13]: dict((v[-1],v[:-1]+[k]) for k,v in d.iteritems())
Out[13]: {'d': ['a', 'b', 'c', '1'], 'h': ['e', 'f', 'g', '2']}

k是原始密钥,v是原始值(列表)。结果中,v[-1]成为新密钥,v[:-1]+[k]成为新值。

编辑正如Adrien Plisson所指出的,Python 3不支持iteritems。此外,在Python 2.7+和3中,可以使用字典理解:

{v[-1]: v[:-1]+[k] for k,v in d.items()} # Python 2.7+

答案 1 :(得分:0)

将密钥设为值,将值设为密钥:

dict2 = dict( (dict1[key], key) for key in dict1 )

dict2 = dict( (value,key) for key, value in dict1.items() )

两者都适用于所有版本的Python。


特殊情况

仅在问题中的示例的特殊情况下,这不起作用,因为列表不能用作键。因此,使用每个列表的最后一个元素作为键并用前一个键替换最后一个元素,我们会变得更复杂:

dict2 = dict( (dict1[key][-1], dict1[key][:-1]+[key]) for key in dict1 )

请注意,从Python 3.0开始,dict.iterkeys(), dict.itervalues(), and dict.iteritems()不再有效。 dict.keys(), dict.values(), and dict.items()没问题。只需迭代一个字典(如for key over dict1)就会返回键列表。经常使用的是

中的排序键
keys = sorted(mydict)

答案 2 :(得分:0)

还有另一种方法:

dict1 = {'1': ['a','b', 'c', 'd'], '2': ['e','f', 'g', 'h']}
dict2 = {}

for k in dict1:

    dict2[dict1[k][-1]]= dict1[k]
    dict2[dict1[k][-1]][-1] = k

print dict2      #{'h': ['e', 'f', 'g', '2'], 'd': ['a', 'b', 'c', '1']}