第七章 可变对像 元组与字典
1. 元组快速入门
- 元组是不可变序列
- 当希望这个数据不改变的时候用元组,其余情况用列表。
1.1 元组的创建
tup=()
print(tup,type(tup))
用()可以创建一个空元组。
1.2 元组的取值
tup=(1,2,3,4,5,6,7)
print(tup[0])
元组的取值方法跟列表相同,不同的是元组不能被修改,如果按照列表的方法修改则会报错,如:
tup=(1,2,3,4,5,6,7)
tup[0]=8
print(tup)
报错显示,元组对象不支持元素赋值。
1.3 元组的另类形式,一个逗号
元组可以加括号,也可以不加括号,元组的元素用逗号隔开就行,元组如果不是空的,至少有一个逗号。
tub=10,
print(tub,type(tub))
tub='王朝','马汉','张龙','赵虎'
print(tub)
1.4 元组解包
可以把元组里的元素赋值给指定的变量。
tub=10,20,30,40
a,b,c,d=tub
print('a=',a)
print('b=',b)
print('c=',c)
print('d=',d)
像这样把元组中的每一个元素赋值给一个变量,叫着元组的解包。
注意:
- 解包时元素的数目和接收元素的变量的数目要保持一致,否则会报错
- 如果遇到解包时接收元组元素的变量不够,需要以列表的方式将多个元素赋值给其中一个变量,则将该变量前加*即可。
- 元素的个数少于变量的个数则会报错
tub=10,20,30,40
a,b,*c=tub
print('a=',a)
print('b=',b)
print('c=',c)
换个变量接收多元素
tub=10,20,30,40
a,*b,c=tub
print('a=',a)
print('b=',b)
print('c=',c)
再换个变量接收多元素
tub=10,20,30,40
*a,b,c=tub
print('a=',a)
print('b=',b)
print('c=',c)
其中的规律大家应该自己已经看明白了,我就不总结了。
2. 可变对象
可变序列属于可变对象的一种。一个对象包括了这三个东西:
- id 标识
- type 类型
- value 值
2.1 两种修改对象的方式
这里有一个列表
a=[1,2,3,4,5,6]
现在有两种改变这个对象的方法:
a=[1,2,3,4,5,6]
a[0]=10
print(a)
print(id(a))
这种方法是改变了变量的值,但是没有改变变量所指向的对象
a=[1,2,3,4,5,6]
a=[7,8,9,10,11]
print(a)
print(id(a))
这种方法是对变量重新赋值了,改变了变量指向的对象
2.2 改变值不一定改变对象
再看一个例子
a=[1,2,3]
b=a
print('a=',a,id(a))
b[0]=10
print('a=',a,id(a))
print('b=',b,id(b))
当我们修改了一个变量的值,如果有其他变量也指向这个对象,则这个变量的值也改变,但对象却是一个对象。
2.3 对象改变了值也可能相同
再看一个例子:
a=[1,2,3]
b=a
print('a=',a,id(a))
b[0]=10
print('a=',a,id(a))
print('b=',b,id(b))
b=[10,2,3]
print('b=',b,id(b))
这次是重新赋值,对象改变了。
所以,关于可变对象,对象和值的关系,通过这些例子,相信你心中有数了。
2.4 举例练习
例题:
a=[1,2,3]
b=[1,2,3]
print(a==b)
print(a is b)
print('a',id(a))
print('b',id(b))
结果
3. 字典
字典是一种方便查找的数据存储方式;是一种新的数据结构,称之为映射。
- 字典和列表一样,都是存储数据的形式
- 列表存储数据方便,但是查询数据没有字典方便
- 字典每个元素都有一对键值对组成,可以快捷的通过键来查询对应的值(key-value)结构
- 每个键值对,我们成为一项(item)
3.1 创建一个字典
a={'name':'葫芦娃','sex':'男','age':10}
print(a['name'],a['sex'],a['age'])
结果
可以很方便的取出我们要的结果值
注意:
- 字典的键最好不用重复,如果重复,后面的值会取代前面相同键的值
- 字典里项如果比较多,为了方便查看也可以实现竖向排列
a = {
'name': '葫芦娃',
'sex': '男',
'age': 10
}
# 可以用快捷键ctrl+shift+alt+L自动调整代码格式(也可以点击上方菜单里的code>reformat code)如下图:
3.2 字典的使用
3.2.1 官方文档查看
3.2.2 用dict()函数来创建字典
d=dict(name='葫芦娃',sex='男',age='10')
print(d,type(d))
结果
3.2.3 dict()将包含有双值子序列的序列转换成字典
双值序列 指有两个值的序列,如:‘gk’, (‘w’,1), [4,5]
子序列 序列中的元素也是个序列。如:[(‘w’,1), [4,5],(1,2)]
d=dict([('name','葫芦娃'),('age',10)])
print(d)
结果
3.2.4 通过字典的键来获取字典的元素
语法:
d[key]
key值一定要加上引号,不然会当作变量来处理
d=dict([('name','葫芦娃'),('age',10)])
print(d['age'])
结果
或者可以这样
d=dict([('name','葫芦娃'),('age',10)])
n='age'
print(d[n])
结果一样,但如果直接这样:
d=dict([('name','葫芦娃'),('age',10)])
print(d[age])
就会报错
3.2.5 get()函数获取字典里的值
d=dict([('name','葫芦娃'),('age',10)])
print(d.get('name'))
结果
假如没有这个键,也不会报错,而是会返回一个None值。
d=dict([('name','葫芦娃'),('age',10)])
print(d.get('name1'))
结果
3.2.6 get(key,[default])函数获取字典中的值
default也可以指定一个默认值来作为第二个参数,如果这个键存在则返回对应的值,如果取不到这个key则返回默认值
d=dict([('name','葫芦娃'),('age',10)])
print(d.get('name1','这个键不存在'))
结果
3.2.7 修改字典
语法格式
d=dict([('name','葫芦娃'),('age',10)])
d['name']='钢铁侠'
通过
字典名['新键']='新值'
的格式可以添加键值对
d=dict([('name','葫芦娃'),('age',10)])
d['name1']='孙悟空'
print(d)
结果
可以看到,再原来字典的基础上又添加了键值对。
如果这个键和里面的键重复,则直接覆盖原来的值。
d=dict([('name','葫芦娃'),('age',10),('name1','孙悟空')])
print(d)
d['name1']='猪八戒'
print(d)
结果
可以看到原来’name1’的值’孙悟空’已经被新的值’猪八戒’覆盖了。
3.2.8 d.setdefault()向字典中添加键值对
- 这种方法,如果新添加的key值已经存在,则返回key值,不对字典做任何的修改
- 如果新添加的key值不存在,则对字典添加新的键值对
d=dict([('name','葫芦娃'),('age',10)])
d.setdefault('name','金刚侠')
print(d)
d.setdefault('name2','沙和尚')
print(d)
结果
3.2.9 update()方法
update()将其他字典的键值添加到当前字典中
d=dict([('name','葫芦娃'),('age',10)])
d2={'name3':'孙悟空','name4':'猪八戒','name5':'沙和尚'}
d.update(d2)
print(d)
print(d2)
如果要有重复的key将被后面的覆盖。
3.2.10 删除键值对
3.2.10.1 用del删除
d={'name': '葫芦娃', 'age': 10, 'name3': '孙悟空', 'name4': '猪八戒', 'name5': '沙和尚'}
del d['name']
del d['age']
print(d)
结果
3.2.10.2 popitem()方法随机删除字典中的一个元素
默认删除字典中最后的一个元素
语法格式
d={'name': '葫芦娃', 'age': 10, 'name3': '孙悟空', 'name4': '猪八戒', 'name5': '沙和尚'}
d.popitem()
print(d)
d.popitem()
print(d)
popitem()会把删除的元素当作返回值
d={'name': '葫芦娃', 'age': 10, 'name3': '孙悟空', 'name4': '猪八戒', 'name5': '沙和尚'}
r=d.popitem()
print(d)
print(r)
3.2.10.3 pop()根据指定的key来删除元素
pop()删除元素也又返回值,返回的是删除的元素的value
d={'name': '葫芦娃', 'age': 10, 'name3': '孙悟空', 'name4': '猪八戒', 'name5': '沙和尚'}
r=d.pop('name3')
print(d)
print(r)
结果
如果要删除的指定key在原来的字典里不存在则会报错
d={'name': '葫芦娃', 'age': 10, 'name3': '孙悟空', 'name4': '猪八戒', 'name5': '沙和尚'}
r=d.pop('name6')
print(d)
print(r)
结果
当然可以传入第二个参数,避免报错,即pop(key,[default])
d={'name': '葫芦娃', 'age': 10, 'name3': '孙悟空', 'name4': '猪八戒', 'name5': '沙和尚'}
r=d.pop('name6','这个key不存在')
print(d)
print(r)
结果
3.2.11 clear()清空字典
语法结构
d.clear()
例如
d={'name': '葫芦娃', 'age': 10, 'name3': '孙悟空', 'name4': '猪八戒', 'name5': '沙和尚'}
d.clear()
print(d)
4. 作业
4.1 写博客梳理本节内容
4.2 课堂代码敲三遍
4.3 课堂作业
4.3.1 字典练习,找指定的值
在字典a = {“name”:“123”,“data”:{“result”:[{“src”:“python1”},{“src”:“python2”},
{“src”:“python3”}]}} 找到python1/python2/python3
答案
a = {"name":"123","data":{"result":[{"src":"python1"},{"src":"python2"},{"src":"python3"}]}}
v_1=a['data']['result'][0]['src']
v_2=a['data']['result'][1]['src']
v_3=a['data']['result'][2]['src']
print(v_1)
print(v_2)
print(v_3)
结果
4.3.2 字典练习,创建字典
有如下值列表[11,22,33,44,55,66,77,88,99,90], 将所有大于66的值保存至字典的第一个key
中,将小于66值保存至第二个key的值中
答案
a=[11,22,33,44,55,66,77,88,99,90]
lst_1=[]
lst_2=[]
for i in a:
if int(i)>66:
lst_1.append(i)
elif:
if int(i)<6:
lst_2.append(i)
num=dict(num_1=lst_1,num_2=lst_2)
print(num)
结果