如題


不能


字典說白了就是哈希表,和元組沒有任何關係從宏觀的視角先說說大背景:

要說對字典有所理解就不得先說說字典的來源了, 首先最簡單的數據結構是數組,由於數組的優勢在於快速定址,即查詢數據能在O(1) 的時間複雜度完成,但是刪除和插入元素的時間複雜度確實O(n)的,涉及到元素的遷移以及擴容操作,因此在這種需求背景下,鏈表誕生了,鏈表的優勢就是刪除,插入可以在O(1) 的時間複雜度完成,但是缺點是查找元素需要O(n)的時間複雜度,因此在需求的驅動下,開發工業級別的不管是查詢,插入,刪除都有比較優秀的數據結構,有了這個大背景對於字典的理解應該是更加的深刻,因為不管是什麼事務,要徹底的理解它,就首先要理解他存在的目的,背景,為什麼要有它,它存在的意義是什麼,它能解決什麼問題,能達到什麼標準

具體實現視角:

集合:實現通過hashtable, 只存key,不存value,主要用作是判重

字典:實現通過hashtable, key-value 存儲,空間換時間,查詢,刪除,插入O(1)

最後贈送三數之和的字典實現演算法作為對字典理解的輔助


不可以,元組和字典,同為兩種不同的數據結構。

字典的長相 math_dict= {『小紅』:90,『小明』:66}

元組是一個不可改變的數據結構,它的近親是列表。跟字典沒啥關係。

字典長這樣:{python:123,『java』:234}

元組長這樣:(python, java)

python 裡面有一個tuple函數,可以輕鬆把字典和列錶轉換為tuple.

你就看tuple 的數據結構長什麼樣子。

tuple({python:123}) # 輸出結果:(python,)

tuple([1,2,3,4]) # 輸出結構 (1, 2, 3, 4)

元組數據結構 ,是防寫「的,即元組創建後不能再做任何修改操作。你可以理解為它是一款安全性 列表。

如果你想 深入學習Python, 有問題可以直接向我提出,最專業的回答。沒有之一


為什麼要這樣理解,字典和元組本質上是完全不同的東西。字典是散列表實現的,而元組在python就是一個無名的記錄(當然也有命名元組),請看CPython定義:

typedef struct {
PyObject_HEAD
Py_ssize_t ma_used;
uint64_t ma_version_tag;

PyDictKeysObject *ma_keys;
PyObject **ma_values;
} PyDictObject;

typedef struct {
PyObject_VAR_HEAD
PyObject *ob_item[1];
} PyTupleObject;

首先這兩個從底層來講就很「不像」,ma_keys指向一個稍微複雜的散列表結構,這裡就不多說了,自己可以去了解。而元組結構就是一個基本的類似整型定義的結構。

你自己也說字典是鍵值對集合,但是鍵值對和二元元組一樣嗎?首先二元元組是沒有對應關係的,位置0和位置1 的記錄本質上沒有任何聯繫,對記錄數據本身也沒有任何要求。而鍵值對是有明確對應關係的,對應到底層,在散列表中是一一對應的,而且對數據本身是有要求的,key必須是可以哈希的。

你說到dict.items返回時元組列表,是否本質上鍵值對就是一個二維元組?恕我直言,這有什麼必然的因果關係嗎?返回什麼是方法定義的,是給使用者看的。

items方法是這樣得:

def items(self):
return ItemsView(self)

進一步ItemsView是這樣得:

class ItemsView(MappingView, Set):
__slots__ = ()
@classmethod
def _from_iterable(self, it):
return set(it)
def __contains__(self, item):
key, value = item
try:
v = self._mapping[key]
except KeyError:
return False
else:
return v is value or v == value
def __iter__(self):
for key in self._mapping:
yield (key, self._mapping[key])

__iter__方法你看到(key, self._mapping[key]),此處就是你看到返回時元組列表得原因,每一個鍵值對都用元組表示。我改一下源代碼,set(key, self._mapping[key])可以返回集合列表,是不是本質上鍵值對就是二維集合呢?字元串化空格分開一下,str(key)+ +str(self._mapping[key]),說明本質上鍵值對就是字元串?明顯不能。你應該看懂了吧。所以看本質你得看底層實現,而不是看方法調用。

而查看一個數據,用不可變的元組比較合適,所以用元組表示,這在底層同樣是的。CPython的static PyObject * dict_items(PyDictObject *mp)函數就定義了字典的返回形式

v = PyList_New(n);
...
item = PyTuple_New(2);
...
PyList_SET_ITEM(v, i, item);
...
return v;

可以看到也是返回的形式採用的確實是元組列表。但是要明白呈現形式和本質完全不是一個東西。


Python 字典(dict)?

www.cjavapy.com

Python 元組?

www.cjavapy.com

Python 集合(set)?

www.cjavapy.com


有朋友評論說字典是鍵值對集合,我十分認可;但是鍵值對與二元元組之間是否有區別是我好奇的點

for k,v in dict.items():

items返回了一個元組列表,是否是說明本質上鍵值對就是一個二維元組,只是名稱上產生了差異呢

入門勿噴


推薦閱讀:
相關文章