Python上的字典索引operator []

时间:2017-01-30 22:29:40

标签: python dictionary

我试图理解index operator []在某些涉及字典的情况下是如何工作的。

>>> {'a': 1, 'b':2}[1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 1

...然而

>>> {True: 1, False:2, True: 3}[1]
3

这里发生了什么?

另外,下面是什么?

>>> {True: 1, False:2, True: 3}
{False: 2, True: 3}

为什么是{True:1,False:2,True:3}&#34;评估为&#34; {False:2,True:3}&#34;?

在搜索答案时,我遇到this question,但我无法在那里找到问题的答案。

感谢。

2 个答案:

答案 0 :(得分:4)

  

{True:1,False:2,True:3} 1

     

这里发生了什么?

这是一个非常具体的案例,可能真的是错误的。在python中,“1”为True,“0”为False,因此您可以将这些整数/浮点数用作布尔键。但是,它不是常规的转换操作,因此如果您尝试使用“1.1”作为键,它将不会被转换为True,即使bool(1.2)== True。所以一般来说 - 你必须使用实际键进行索引。事实上,True实际上是1“幕后”而False是0是一个特定的例外,你不应该根据这种行为编写代码。

d = {True: 'test', False: 'test'}
print d[True] # works, valid use
print d[False] # works, valid use
print d[1] # works due to Python specifics, do not use
print d[0] # works due to Python specifics, do not use
print d[1.0] # works due to Python specifics, do not use
print d[0.0] # works due to Python specifics, do not use
print d[1.1] # raises exception, as it should
print d[''] # raises exception, as it should

这是在Python中定义布尔类型的结果

  

布尔值是两个常量对象False和True。它们用于表示真值(尽管其他值也可以被认为是假或真)。在数字上下文中(例如,当用作算术运算符的参数时),它们的行为分别与整数0和1相似。如果值可以解释为真值,则内置函数bool()可用于将任何值强制转换为布尔值(请参阅上面的真值测试部分)。

因此showing why 1==True and 0==False

更确切地说,Python字典是哈希表,因此为了找到给定的密钥,计算其哈希值(通过哈希(密钥)),其指向给定的“桶”,然后迭代地检查该缓冲区是否密钥等于到了那个桶里。而且由于在Python hash(1)== hash(1.0)== hash(True)以及1 == 1.0 == True,它们将作为相同的密钥工作。另一方面,hash(1.1)!= hash(1.0)所以它不会相同。这说明了为什么投射,它是关于平等和散列。

  

为什么{True:1,False:2,True:3}“评估为”{False:2,True:3}“?

因为在字典中,每个键只能有一个值,所以您尝试将两个不同的值分配给键“True”,并且只分配了一个。

答案 1 :(得分:-1)

Python dict是一个从键到值的映射,它映射&#34; hashable&#34;对于任意值对象的值,每个键只能有一个值。

在这种情况下你的例子

>>> {True: 1, False:2, True: 3}
{False: 2, True: 3}

与此基本相同

>>> {"a": 1, "b": 2, "a": 3}
{'a': 3, 'b': 2}

唯一的一个是True,或者&#34; a&#34;价值保持不变。

通过[]进行访问不是dict中的索引,它通过密钥进行引用。即你可以写这样的东西

>>> my_map = {"a": 1, "b": 2}
>>> my_map["b"]
2

为什么1代替True是因为boleans如何定义为wkr作为@lejlot解释的整数值1和0,你应该尽可能避免依赖这些东西。