本章介绍python的一些数据结构
dict字典
字典是用来映射的。它的映射方式就是hash的形式,即key键值与value值一一对应。
创建方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
>>> dict1 = {1:'one', 2:'two', 3:'three'} >>> dict1 {1: 'one', 2: 'two', 3: 'three'}
>>> dict2 = dict(key1='value1') >>> dict2 = dict(key1='value1',key2 = 'val2') >>> dict2 {'key2': 'val2', 'key1': 'value1'}
>>> dict2 = dict(1='one',2='two',3 = 'three') File "<stdin>", line 1 SyntaxError: keyword cant be an expression
>>> seq = ('bella','julia','mary')
>>> dict3 = dict.fromkeys(seq,) >>> dict3 {'bella': None, 'mary': None, 'julia': None}
>>> dict3.fromkeys(seq,10) {'bella': 10, 'mary': 10, 'julia': 10}
>>> dict1[1]= 'one' >>> dict1 {1: 'one', 3: 'three'}
>>> dict1[1] = 1 >>> dict1 {1: 1, 2: 'two', 3: 'three'} >>>
|
一些操作
values()
用于获得值
1 2 3 4 5
| >>> dict1 {1: 'one', 2: 'two', 3: 'three'} >>> dict1.values() dict_values(['one', 'two', 'three']) >>>
|
keys()
用于获得key值
值得注意的是,keys(),values()等,与for连用的时候比较多,因为就获取一个值也没有多大意义,批量操作威力才比较大,也比较显示程序的用处嘛
1 2 3 4 5 6 7 8 9
| >>> dict1.keys() dict_keys([1, 2, 3]) >>> for eachkey in dict1.keys(): ... print(eachkey+1) ... 2 3 4 >>>
|
items()
用于获得key值+值
1 2 3
| >>> dict1.items() dict_items([(1, 'one'), (2, 'two'), (3, 'three')]) >>>
|
popitem()
用于随机弹出一组键值和值,并在字典中删除它
1 2 3 4 5 6 7 8
| >>> dict1 {1: 'one', 2: 'two', 3: 'three'} >>> dict1.popitem()
(3, 'three')
>>> dict1 {1: 'one', 2: 'two'}
|
pop()
用于弹出指定键值的值,并在字典中删除它
1 2 3 4 5 6
| >>> dict1 {1: 'one', 2: 'two'} >>> dict1.pop(1) 'one' >>> dict1 {2: 'two'}
|
get()
用于弹出指定键值的值,如果找不到,可以返回一个设置的默认值,或者none
1 2 3 4 5 6 7 8 9
| >>> dict1 {1: 'one', 2: 'two', 3: 'three'} >>> dict1.get(4,'four')
>>> print(dict1.get(5)) None
|
copy()
进行浅拷贝
先说一下深浅拷贝
- 深拷贝:相当于一个指针,指向了原来的地址。如果修改深拷贝的内容,那么原来的内容也会跟着改动
- 浅拷贝:相当于重新开辟了一个地方,把跟拷贝内容相同的内容原样复制过去。修改浅拷贝的内容,原来内容不会有一点影响
我们来看一个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| >>> a = {1: 'one', 2: 'two', 3: 'three'} >>> b = a.copy() >>> c = a >>> id(a) 4312668424 >>> id(b) 4312668360 >>> id(c) 4312668424
>>> b[4] = 'four' >>> b {1: 'one', 2: 'two', 3: 'three', 4: 'four'} >>> a {1: 'one', 2: 'two', 3: 'three'}
>>> c[4] = 'four' >>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
|
setdefault() 与get()的区别
setdefault() 和get()很像,但是get设置默认值之后,不会对原来的字典进行添加,但是setdefault比较智能一点,它会添加进去
1 2 3 4
| >>> dict1.setdefault(5,'five') 'five' >>> dict1 {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'}
|
update() 用来更新字典
两种更新可能性:
- 原本存在新字典中的key值:替换原值
- 原本不存在新字典中的key值:增加这一组key值和原值
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 原本没有的key值 >>> dict2 = {6:'six',7:'seven'} # 6,7在dict1中没有哦 >>> dict1.update(dict2) # 用dict2去更新1 >>> dict1 # 可以看到dict1有了6,7 {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five', 6: 'six', 7: 'seven'}
# 原本有key值 >>> dict3 = {4:'4',5:'5'} >>> dict1.update(dict3) >>> dict1 # 4,5被替换了呢 {1: 'one', 2: 'two', 3: 'three', 4: '4', 5: '5', 6: 'six', 7: 'seven'}
|
字典就介绍道这里,是不是很方便?
set集合
因为集合要讲的内容不多,所以就一起写在dict这里啦
集合,学过数学的都记得,是一些东西的组成的集体。无关顺序,无关出现次数。也就是说,无论它是按照什么样的顺序出现,或是出现很多次,都不影响。集合只知道它存在,或者不存在
创建方式
有两种
- {}的创建:大家不要误会,跟字典的创建确实是一样的,但是字典还有:来表示映射关系,但集合没有,直接用{}括起来就行啦
- set([])来创建
1 2 3 4 5 6 7
| >>> set1 = set([3,1,2,0]) >>> set1 {0, 1, 2, 3}
>>> set2 = {1,2,3,3,3,3,4,4,5,5,6} >>> set2 {1, 2, 3, 4, 5, 6}
|
访问
访问的方式没有什么独特的,就是for,in 或not in
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| >>> set2 {1, 2, 3, 4, 5, 6} >>> for each in set2: ... print(each**2) ... 1 4 9 16 25 36
>>> set2 {0, 1, 2, 3}
>>> 2 in set2 True # 2在集合2中
>>> 6 in set2 False # 6不在集合2中
|
添加、删除元素
1 2 3 4 5 6 7
| >>> set2.add(6) >>> set2 {0, 1, 2, 3, 6} >>> set2.remove(0) >>> set2 {1, 2, 3, 6}
|
冰冻集合
除了这种可以变动的集合,如果想有一个集合,是不能被修改的,那就是frozenset啦,冰冻集合
1 2 3 4 5
| >>> set3 = frozenset([1,2,3,4,5]) >>> set3.add(6) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'frozenset' object has no attribute 'add'
|
可以看到如果想要改动它,就会报错
另外,集合是不能进行索引的,否则会酱:
1 2 3 4
| >>> set2[1] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'set' object does not support indexing
|