参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017104324028448
dict是字典,可以储存键值对类型的值,set与dict相同,只是set只储存key值,而不储存value。
补充:
python中数值类型(int、float)、元组、str是不可变对象,而列表list、字典dict、集合set是可变对象
list.cout('a')查看list中'a'的个数
>>> l ['a', 2] >>> l.count('a')
List
问题:list index out of range 和 list assignment index out of range的原因
>>> a=[[],[],[1]] >>> a[0][-1]=5 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list assignment index out of range#是再下标溢出的情况下依旧分配值的时候出现的异常 >>> a[0][-1] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range#是访问的下标超出了list的地址 >>> a[0][1]=5 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list assignment index out of range >>> a[0][1] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: list index out of range >>>
dict
a={'sex':'nan'} >>> 'sex' in a#默认在key中检查 True >>> 'nan' in a False >>> 'sex' in a.values() False >>> 'nan' in a.values() True >>> 'sex' in a.keys() True >>>
dict又称map,他以键值对的形式储存数据,并且为了查找方便,在存储数据的时候,会根据key的值去计算应该放置的位置。为了保证计算位置的算法的结果不冲突,所以就要求dict数据的key值不能重复。由于这种特性,使得在查找数据时,与list的从头开始查找相比,dict中储存的数据查找时极快的,但是对空间有些浪费,因为常规情况下的带储存数据经过算法处理后,并不会无间隔的紧密的按顺序放置在内存中,而是分散的。
dict内部存放的顺序和key放入的顺序是完全没有关系的
dict的key必须是不可变对象,因为dict内使用hash计算key存放的位置,如果每次计算相同的key得出的结果不同,就会造成key的混乱,如果用可变对象当作key,会报错
>>> key = [1, 2, 3] >>> d[key] = 'a list' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'
dict的一些方法和特性
一个key只能对应一个value
可以通过in判断是否存在(只匹配key,不匹配value)
>>> l={'a':'1','b':'2'} >>> 'a' in l True >>> '1' in l False
还可以通过 get() 方法获取指定key的内容,若key不存在,返回None,或者返回自己指定的内容
>>> l.get('a') '1' >>> l.get('1')#返回None >>> l.get('1',aaa) Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'aaa' is not defined#因为必须写“aaa” >>> l.get('1',1111) 1111 >>>
使用 pop(key) 方法删除指定的key值
使用remove()删除list中的index
参考链接:https://blog.csdn.net/u013066730/article/details/85260764
使用dict一定要注意,dict的key一定是不可变对象,在Python中,字符串、整数等都是不可变的,而list是可变的。
list与dict的区别:
两者之间的区别主要在于查找速度和对储存的使用率上面
1)list的查找速度会随着存放数据的数量的增加而增加,但占用的内存小,浪费内存还小。
2)dict的查找速度极快,不会受存放数据数量大小的影响,但占用内存大,浪费空间多。
set
set 和dict类似,也是一组 key 的集合,但不储存 value ,同样的key不能重复。
使用一个list作为输入创建set
>>> s=set([1,2,'a'])#注意创建时传入的参数是一个list >>> s {1, 2, 'a'}#这样显示并不代表set是有序的 >>> s=set([1,2,'a','a']) >>> s {1, 2, 'a'} #不重复 >>>
使用 add(key) 添加 key 到 set 中
>>> s.add('b') >>> s.add('a')#重复添加没有效果 >>> s {1, 2, 'a', 'b'}
使用 romove(key) 删除
set 可以看作为数学意义上的一个集合,这个集合中的元素是无序的、是不重复的,可以做数学意义上的交集、并集操作。
>>> b=set([3,4,'d']) >>> s&b#交集 set() >>> b {'d', 3, 4} >>> s|b#并集 {1, 2, 'a', 3, 4, 'b', 'd'} >>>
不能添加可变元素,注意:tuple虽然是不可变元素,但是包含可变元素的tuble也不行
>>> b.add([5,6]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' AttributeError: 'tuple' object has no attribute 'add' >>> b.add((1,2,[3,4]))#tuple中包含了可变元素list Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' >>>
可变与不可变对象
不可变对象就是虽然看起来对他的改变会生效,是因为其返回一个新的对象。如
>>> a = 'abc' >>> b = a.replace('a', 'A') >>> b 'Abc' >>> a 'abc'
而可变对象如 list
>>> l=[1,2] >>> l [1, 2] >>> l[0]='a' >>> l ['a', 2] >>>
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。