Python学习:基础(4)dic,list,set的性质和删除操作:

python里面的dic与set类似与C++中的map和set.首先说一下dic,它是以key-value的形式来存储数据的,而set是以key的形式存储数据,它们共同的特点都是以空间换时间,采用hash算法来找到所查找元素的位置,但是占用的内存很大.

简单说明一下为什么浪费了很多内存,因为map和set是采用hash-table的形式实现的,它利用了一个桶维护许多指针,每一个指针都指向一个链表,这个指针就代表一种key计算出来的值所在的位置.不同的key计算出相同值就都挂在这个链表上面,而这个链表上的每一个节点则需要存储下一个节点的信息,同时为了保证性能,桶的大小是大于等于key的数量的(有可能每一个key计算出来的hash值都不一样),所以它消耗的内存远远大于list;

然后说明一下key的选择,注意到key必须是不变的,因为如果key变化,那么找到的value就不准确了。

在python中,str和int可以作为key,但是a = 'sss',a就不可以,因为a是一个变量,只有常量’sss’是可以的.同时list也不可以作为key值;

那么tuple呢?tuple里面的元素都类似于指针,如果tuple指向的元素也是不可变的,那么就可以作为key,比如

s = {(1,[2,3])}不可以,s = {(1,2,3)}就是可以的.

注意 set在初始化的时候 s= set([1,2,3])不代表将list[1,2,3]作为key,只是将list指向的元素作为了key。

python提供了 .get,.pop,.remove,.add等方法来操作.

[0]:对于del方法,它是根据索引来删除元素,但是对于不同的数据类型它的效率有很大区别:

N = 10000000
a = [i for i in range(0,N)]
d = {i:i for i in range(N) }

start = time.clock()

end = time.clock()
print(end-start)
for i in range(N-100000,N-100000-(N//100),-1):del d[i]
start = time.clock()
for i in range(N-100000,N-100000-(N//100),-1):del a[i]
end = time.clock()
print(end-start)

对于list而言,del的效率与删除元素的位置有关系,因为del之后需要改变该索引之后的所有元素的索引(都要减少1),极端情况下需要O(N)的时间.

对于dict而言,del则无关元素位置,因为dict是一个无序结构.

pop类似于del,只是返回相应的元素.

关于remove则是删除指定元素,而不是根据索引判断的.

你可能感兴趣的:(Python学习:基础(4)dic,list,set的性质和删除操作:)