当我定义一个使用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
答案 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使用下标的方式是a
是a
,a, 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
视为元组。这个词也做了同样的事。