dict和set

使用dict和set

小小白第一次开始更新blog,用来督促自己学习~,学习资料来自于各大网站,学习的地址会po到网页上,基本上都是开源的地方学来的知识,可能要过一段时间才有能力自己产出代码嘿嘿。大四学生,新手一枚,如有错误,请多指教

dict字典

python内置了字典:dict的支持,在其它语言也称为map,使用key-value存储对象,哈希算法,相对于list更方便,例子如下

使用list存储姓名和成绩:

name = ['Michael','Bob','Tracy']
scores = [90,80,70]

使用dict存储姓名和成绩:

d = {'Michael':90,'Bob':80,'Tracy':70}
d['Micheal']

>>>90

之所以dict方便好用,也不会因为数据越来越大而搜索的越来越慢,是因为字典使用了索引,给定一个名字,dict在内部就可以直接计算出该名字对应的存放成绩的页码,如Micheal,直接取出90,所以速度很快,就如同翻新华字典。

把数据放入dict的方法,除了初始化指定,还可以通过key放入:

>>>d['Adam']=60
>>>d['Adam']
>60

如果key不存在,dict会报错

>>>d['Thomas']
>Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Thomas'

避免key不存在 可以通过in判断

if 'Thomas' in d:
	print(d['Thomas'])

或者通过dict()提供的get()方法,如果key不存在,返回None或指定value

d.get('Thomas')
d.get('Thomas',-1)
>-1

要删除一个key,用pop(key)方法,对应的value也会一起删除

d.pop('Bob')
80
>>>d
>{'Micheal':90,'Tracy':70}

如下需要注意,dict为乱序存储(但是我听说3.6变顺序了?)
且了解数据库的都知道索引会导致数据库维护时间增长(也就是字典随着数据增大会占用大量内存),但是好处是搜索时间极快且不会因为数据增多而速度下降,list与之相反,数据增大速度变慢,但是占用内存小。
还需牢记dict的key是不可变对象,因为dict根据key来计算value的位置(哈希算法)

set

set和dict类似,也是一组key的集合,但不存储value,且key不能重复
要创建一个set,需要提供一个list作为输入集合

s = set([1,2,3])
s
>{1,2,3}

需注意传入的参数{1,2,3}是一个list,而显示的{1,2,3}只是告诉你内部有1,2,3这三个元素,不代表set是有序的哈哈。

重复元素在set中被自动过滤

s = set([1,1,1,2,3,4,4,4])
s
>{1,2,3,4}

通过add(key)方法可以添加元素到set中,可以重复添加但无效果

s.add(5)
s
>{1,2,3,4,5}
s.add(5)
s
>{1,2,3,4,5}

通过remove(key)方法删除元素

s.remove(4)
s
>{1,2,3,5}

set可以堪称数字意义上的无序和无重复元素的集合,因此两个set可以做数学意义上的交集、并集等操作:

s1 = set([1,2,3])
s2 = set([2,3,4])
s1&s2
>{2,3}
s1|s2
>{1,2,3,4}

dict和set唯一区别在于没有存储value,但是原理一样,所以不可以放入可变对象,因为无法判断两个可变对象是否相等,也无法保证set内部不会有重复元素

最后再说一个好玩的

对于可变对象,比如对list进行操作,list内部会发生变化,比如:

a = ['c','b','a']
a.sort()
a
>['a','b','c']

而对于不可变对象,如str

a = 'abc'
a.replace('a','A')
'Abc'
a
>'abc'

虽然字符串有replace()方法,也确实出现了‘Abc’ 但变量a仍然是‘abc’

a = 'abc'
b = a.replace('a','A')
b
>'Abc'
a
>'abc'

因为a本身是一个变量,变量的方向指向了str ‘abc’
a -------------> ‘abc’
当调用replace方法时,实际上调用方法replace是作用在字符串对象‘abc’的,虽然叫replace,但是却没有改变字符串的内容,而是创建了一个新的字符串并返回,如果用新变量b指向该字符,就更容易理解了
b -------->a.replace--------->‘Abc’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值