我写了一个函数,用于在字典中交换键和值。
def reverse_dict(my_dict):
my_dict2 = dict((v,k) for k,v in my_dict.iteritems())
return my_dict2
为此,我不能使用具有相同值的不同键。 例如:
random_dict = {"a" : 1, "b" : 2, "c" : 1}
如果输入字典中出现多次值,如何抛出ValueError
?
答案 0 :(得分:1)
只需检查len(my_dict2) == len(my_dict)
。 。 。如果它们的长度不同,请提高ValueError
def reverse_dict(my_dict):
my_dict2 = dict((v,k) for k,v in my_dict.iteritems())
if len(my_dict2) != len(my_dict):
raise ValueError('Disallowed duplicate value in dictionary')
return my_dict2
如评论中所示,您可以使用字典理解而不是dict
和生成器表达式:
my_dict2 = {v: k for k,v in my_dict.iteritems()}
如果你真的针对python2.7 +
,它会稍微简洁一点(并且表现得很好)答案 1 :(得分:1)
您可以跳过理解,并随时查看:
#!python2
def reverse_dict(my_dict):
my_dict2 = {}
for k,v in my_dict.iteritems():
if v not in my_dict2:
my_dict2[v] = k
else:
raise ValueError(v)
return my_dict2
random_dict = {"a" : 1, "b" : 2, "c" : 1}
random_dict2 = reverse_dict(random_dict)
输出:
Traceback (most recent call last):
File "C:\test.py", line 12, in <module>
random_dict2 = reverse_dict(random_dict)
File "C:\test.py", line 8, in reverse_dict
raise ValueError(v)
ValueError: 1
通过这种方式,您可以了解复制品的价值。
答案 2 :(得分:1)
您还可以检查random_dict.values()
的长度是否等于set(random_dict.values())
。
让我们看看:
>>> random_dict = {"a" : 1, "b" : 2, "c" : 1}
>>> len(random_dict.values())
3
>>> len(set(random_dict.values()))
2
>>> random_dict.values()
dict_values([1, 2, 1])
>>> set(random_dict.values())
{1, 2}
所以很简单:
>>> if not len(random_dict.values()) == len(set(random_dict.values())):
... raise ValueError
...
Traceback (most recent call last):
File "<input>", line 2, in <module>
raise ValueError
ValueError
答案 3 :(得分:1)
您只需要:
values = my_dict.values()
if len(values) != len(set(values)):
raise ValueError
转换键和值之前
def reverse_dict(my_dict):
values = my_dict.values()
if len(values) != len(set(values)):
raise ValueError
my_dict2 = dict((v,k) for k,v in my_dict.iteritems())
return my_dict2