2010-11-11 15 views
1

當我定義詞典在使用清單爲重點爲什麼清單爲重點的字典,仍然將其自身顯示爲元組作爲密鑰詞典

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 

回答

3

參數defaultdict不是鍵的類型,它是一個創建默認數據的函數。您的測試用例不會執行此操作,因爲您正在使用定義的值填充字典而不使用任何默認值。如果您嘗試獲取值list_as_dict_key['abc', 7, 8],它將返回一個空列表,因爲這是您定義的默認值,並且您從不在該索引處設置該值。

0

字典密鑰只能是immutable types。由於列表是可變類型,因此必須將其轉換爲不可變類型,例如用作字典鍵的元組,並且此轉換將自動完成。

1

有一篇很好的文章解釋了爲什麼你不能使用列表作爲密鑰的答案here

1

當您向字典中添加值時,您在兩種情況下都以相同方式進行操作,並將它們視爲元組。你傳遞給構造函數的是任何不存在的鍵的默認值。在這種情況下,您的默認值恰好是「type」類型,但與其他鍵的處理方式完全無關。

+0

用於正確解釋事件的 – GWW 2010-11-11 05:36:50

+0

您的意思是,我使用defaultdict(list),但在運行時,這會作爲defaultdict(tuple)處理? – 2010-11-11 05:38:50

+1

不,我的意思是它與此完全無關。 – EMP 2010-11-11 05:40:49

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作爲一個元組。字典也做了同樣的事情。