Python:如果字典中的两个键具有相同的值,如何引发错误?

时间:2016-01-19 05:31:43

标签: python python-2.7 dictionary

我写了一个函数,用于在字典中交换键和值。

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

4 个答案:

答案 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