如题


不能


字典说白了就是哈希表,和元组没有任何关系从宏观的视角先说说大背景:

要说对字典有所理解就不得先说说字典的来源了, 首先最简单的数据结构是数组,由于数组的优势在于快速定址,即查询数据能在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返回了一个元组列表,是否是说明本质上键值对就是一个二维元组,只是名称上产生了差异呢

入门勿喷


推荐阅读:
相关文章