为什么列为关键字典,仍然会将自身显示为关键字典的元组

时间:2010-11-11 05:24:59

标签: python

当我定义一个使用list作为键的字典时

collections.defaultdict(list)

当我打印出来时,它显示自己使用元组作为键。

我可以知道为什么吗?

import collections

tuple_as_dict_key = collections.defaultdict(tuple)
tuple_as_dict_key['abc', 1, 2] = 999
tuple_as_dict_key['abc', 3, 4] = 999
tuple_as_dict_key['abc', 5, 6] = 888
# defaultdict(<type 'tuple'>, {('abc', 5, 6): 888, ('abc', 1, 2): 999, ('abc', 3, 4): 999})
print tuple_as_dict_key

list_as_dict_key = collections.defaultdict(list)
list_as_dict_key['abc', 1, 2] = 999
list_as_dict_key['abc', 3, 4] = 999
list_as_dict_key['abc', 5, 6] = 888
# defaultdict(<type 'list'>, {('abc', 5, 6): 888, ('abc', 1, 2): 999, ('abc', 3, 4): 999})
# Isn't it should be defaultdict(<type 'list'>, {['abc', 5, 6]: 888, ...
print list_as_dict_key

5 个答案:

答案 0 :(得分:3)

defaultdict的参数不是键的类型,它是一个创建默认数据的函数。您的测试用例不会执行此操作,因为您使用定义的值填充dict而不使用任何默认值。如果您尝试获取值list_as_dict_key['abc', 7, 8],它将返回一个空列表,因为这是您定义的默认值,并且您从未在该索引处设置该值。

答案 1 :(得分:1)

有一篇很好的文章解释了为什么你不能将列表用作关键here的答案。

答案 2 :(得分:1)

当您在字典中添加值时,您在两种情况下都以相同的方式进行操作,并将它们视为元组。传递给构造函数的是任何不存在的键的默认值。在这种情况下,您的默认值恰好是“type”类型,但这与其他键的处理方式完全无关。

答案 3 :(得分:0)

字典键只能是immutable types。由于列表是可变类型,因此必须将其转换为不可变类型(如元组)以用作字典键,并且此转换将自动完成。

答案 4 :(得分:0)

defaultdict 设置为列表。它设置了默认的

>>> from collections import defaultdict
>>> d1 = collections.defaultdict(list)
>>> d1['foo']
[]
>>> d1['foo'] = 37
>>> d1['foo']
37
>>> d1['bar']
[]
>>> d1['bar'].append(37)
>>> d1['bar']
[37]

你获得元组作为键类型的方式是正常的dict行为:

>>> d2 = dict()
>>> d2[37, 19, 2] = [14, 19]
>>> d2
{(37, 19, 2): [14, 19]}

Python使用下标的方式是aaa, b是元组,a:b是切片对象。了解它如何与列表一起使用:

>>> mylist = [1, 2, 3]
>>> mylist[4, 5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list indices must be integers, not tuple

4, 5视为元组。这个词也做了同样的事。