奇怪的字典构造 - 重复键

时间:2016-09-02 15:50:21

标签: python python-3.x dictionary

我需要编写一个映射'映射的函数。 -1到' - ',1到'' (是的,没有)和其他每个字符串表示的值。我没有使用if语句,而是使用像这样的字典:

def adj(my_value):
    return {-1: '-', 1: '', my_value: str(my_value)}[my_value]

然后它击中了我,这个词典允许重复键,行为如下:

for x in [-1, 1, 4]:
    print(adj(x))
# -> -1
# -> 1
# -> 4

我确实多次运行以确保print()不是"随机"由于dicts没有排序,但我一直得到这个输出。

现在这绝对不是我想要的行为,并且绝不可以信任这样的构造但是有人知道为什么甚至允许这样的事情,因为重复的键不是吗?如何进行计算?

3 个答案:

答案 0 :(得分:6)

您制作的词典没有重复的键。 "重复"相互覆盖。它就像你这样做了:

d = {}
d[1] = ''
d[1] = 1
print(d[1])

演示:

>>> def adj(my_value):
...     d = {-1: '-', 1: '', my_value: str(my_value)}
...     print(d)
...     return d[my_value]
...
>>> for x in [-1, 1, 4]:
...     print(adj(x))
...
{1: '', -1: '-1'}
-1
{1: '1', -1: '-'}
1
{1: '', 4: '4', -1: '-'}
4
顺便说一句,你可以写下这样的函数:

def adj(my_value)
    d = {-1: '-', 1: ''}
    return d.get(my_value, str(my_value))

答案 1 :(得分:4)

引用Python docs

  

如果给出了逗号分隔的键/数据对序列,则从左到右计算它们以定义字典的条目:每个键对象用作字典中的键以存储相应的数据。 这意味着您可以在键/基准列表中多次指定相同的键,并且该键的最终字典值将是给定的最后一个。

它不是未定义的行为,它就好像你创建了一个空字典并逐个设置每个键。您可以通过改变订单来修复您的代码:

def adj(my_value):
    return {my_value: str(my_value), -1: '-', 1: ''}[my_value]

其他人可能会发现这种方法难以阅读,因此您可能希望使用dict.get的默认值,正如其他答案所示。

最近在Python mailing list上提出了您的问题(更易于阅读的格式here)。

答案 2 :(得分:1)

通过执行{-1: '-', 1: '', my_value: str(my_value)},如果-1分别为1my_value,则会覆盖-11条目。相反,您可以使用dict.get with a default value

def adj(my_value):
    return {-1: '-', 1: ''}.get(my_value, str(my_value))