python学习手册(4)

来源:互联网 发布:plc模拟仿真软件 编辑:程序博客网 时间:2024/06/05 10:05

dict字典

字典是用来映射的。它的映射方式就是hash的形式,即key键值与value值一一对应。

创建方式:

# 方法一:直接创建。使用花括号。# 冒号前是键值key,冒号后面是它对应的值>>> 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'}# 要注意到,等号的创建方式,前面的key值不能是表达式,也就是不能实现上面的1,2,3,的那种形势。>>> dict2 = dict(1='one',2='two',3 = 'three')  File "<stdin>", line 1SyntaxError: keyword cant be an expression# 方法三:fromkeys通过键值创建字典>>> seq = ('bella','julia','mary')# 可以不带值,直接用序列去当做key值,生成一个新的字典>>> dict3 = dict.fromkeys(seq,)>>> dict3{'bella': None, 'mary': None, 'julia': None}# 也可以带值,这个值是付给每一个key值的# 不能企图只给其中某几个key值赋值>>> dict3.fromkeys(seq,10){'bella': 10, 'mary': 10, 'julia': 10}# 如果要添加item(也就是key值+值)进字典中怎么办呢?直接用方括号赋值就行啦>>> dict1[1]= 'one'>>> dict1{1: 'one', 3: 'three'}# 要注意的是,如果本来就已经有了这个key值,那么直接会覆盖原有的value,不会重复添加。因为一个字典里,key值是唯一的,不能重复的。value可以重复。>>> dict1[1] = 1>>> dict1{1: 1, 2: 'two', 3: 'three'}>>> 

一些操作:


values() 用于获得值

>>> dict1{1: 'one', 2: 'two', 3: 'three'}>>> dict1.values()dict_values(['one', 'two', 'three'])>>> 

keys() 用于获得key值

值得注意的是,keys(),values()等,与for连用的时候比较多,因为就获取一个值也没有多大意义,批量操作威力才比较大,也比较显示程序的用处嘛

>>> dict1.keys()dict_keys([1, 2, 3])>>> for eachkey in dict1.keys():...     print(eachkey+1)... 234>>> 

items() 用于获得key值+值

>>> dict1.items()dict_items([(1, 'one'), (2, 'two'), (3, 'three')])>>> 

popitem() 用于随机弹出一组键值和值,并在字典中删除它

>>> dict1{1: 'one', 2: 'two', 3: 'three'}>>> dict1.popitem()# 可以看到,它选中了3,弹出来了(3, 'three')# 然后我们再看字典里,已经没有这个3了>>> dict1{1: 'one', 2: 'two'}

pop() 用于弹出指定键值的值,并在字典中删除它

>>> dict1{1: 'one', 2: 'two'}>>> dict1.pop(1) # 我们指定要弹出键值为1的'one'>>> dict1 # 可以看到,已经被弹出并删除了{2: 'two'}

get() 用于弹出指定键值的值,如果找不到,可以返回一个设置的默认值,或者none

# 带默认值,直接跟在想要get的key值后面,用逗号隔开>>> dict1{1: 'one', 2: 'two', 3: 'three'}>>> dict1.get(4,'four')# 不带默认值,则是none。如果不用print,就什么反应都没有>>> print(dict1.get(5))None

copy() 进行浅拷贝

先说一下深浅拷贝。

  • 深拷贝:相当于一个指针,指向了原来的地址。如果修改深拷贝的内容,那么原来的内容也会跟着改动
  • 浅拷贝:相当于重新开辟了一个地方,把跟拷贝内容相同的内容原样复制过去。修改浅拷贝的内容,原来内容不会有一点影响

我们来看一个例子

>>> a = {1: 'one', 2: 'two', 3: 'three'}>>> b = a.copy()>>> c = a>>> id(a) # 注意看a的地址4312668424>>> id(b) # b的地址和a的就不一样了,说明是新开辟的4312668360>>> id(c) # c的地址和a一样,相当于知道a的家在哪里,直接住在a的家里一样4312668424>>> b[4] = 'four' # b添加了4进去>>> b {1: 'one', 2: 'two', 3: 'three', 4: 'four'}>>> a # a丝毫不受影响{1: 'one', 2: 'two', 3: 'three'}>>> c[4] = 'four' # c也添加了4进去>>> a  # a也跟着变了。因为c和a住在一起了{1: 'one', 2: 'two', 3: 'three', 4: 'four'}

setdefault() 与get()的区别

setdefault() 和get()很像,但是get设置默认值之后,不会对原来的字典进行添加,但是setdefault比较智能一点,它会添加进去

>>> dict1.setdefault(5,'five')'five'>>> dict1{1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'}

update() 用来更新字典

两种更新可能性:

  • 原本存在新字典中的key值:替换原值
  • 原本不存在新字典中的key值:增加这一组key值和原值
# 原本没有的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([])来创建
>>> 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

>>> set2{1, 2, 3, 4, 5, 6}>>> for each in set2:...     print(each**2)... 149162536>>> set2{0, 1, 2, 3}>>> 2 in set2True   # 2在集合2中>>> 6 in set2False  # 6不在集合2中

添加、删除元素

>>> set2.add(6)>>> set2{0, 1, 2, 3, 6}>>> set2.remove(0)>>> set2{1, 2, 3, 6}

除了这种可以变动的集合,如果想有一个集合,是不能被修改的,那就是frozenset啦,冰冻集合

>>> 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'

可以看到如果想要改动它,就会报错

另外,集合是不能进行索引的,否则会酱:

>>> set2[1]Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: 'set' object does not support indexing
0 0