元组和字典
元组
- 什么是元组(tuple)
元组是不可变的列表
元组是容器型数据类型,将小括号()作为容器的标志,里面多个元素用逗号隔开:(元素1,元素2,元素3…)
元组不可变(不支持元素的增删改,查可以),元组是有序的(支持下标操作)
元素:元组中的元素:任何类型的数据,并且可以重复
t1 = (10, 23, 90, 10)
print(type(t1), t1)
- 只有一个元素的元组: (元素,)
list1 = [23]
print(list1, type(list1))
t3 = (23,)
print(t3, type(t3))
t4 = (23)
print(t4, type(t4)) # 23 <class 'int'>
- 省略括号
t5 = 'abc', 10, 100, True
print(type(t5)) # <class 'tuple'>
t6 = 10, 20, 30 * 2 # 是元组的二倍还是30的二倍,有歧义就加上括号
print(t6)
``
获取元素
```python
song = ('葫芦娃', '海阔天空', '霸王别姬', '夜曲', '稻香', '下山')
print(song[1], song[-5])
print(song[2:])
for x in song:
print('x:', x)
for index, i in enumerate(song):
print(index, i)
for index in range(len(song)):
print(song[index])
让变量的个数和元组中元素的个数保持一致来获取元组所有元素的值
t7 = (10, 102, 32)
x, y, z = t7
print(x, y, z) # 10 102 32
同时用多个变量获取元组元素的时候,变量的个数可以比元组中元素的个数少,但必须是有且只有一个变量前有*
stu = ('小明','男', '30', '59', '70')
m1, m2, *m3 = stu
print(m1, m2)
print(m3)
m1, *m2, m3 = stu
print(m1, m3, m2)
*m1, m2, m3 = stu
print(m1, m2, m3)
name, sex, *message, height = stu
print(name, sex, height, message)
元组相关操作
列表相关操作元组都支持
stored,进行排序操作之后所产生的是列表,而不是元组,想要元组可以直接转换
列表的相关方法元组不支持
print(tuple(range(10, 15))) # (10, 11, 12, 13, 14)
print(sum((10, 20, 30)))
print(max((10, 20, 30)))
print(min((10, 20, 30)))
nums = (10, 20, 30, 40, 50)
new_nums = sorted(nums)
print(new_nums)
print(len(nums))
print(tuple('abc'))
print(tuple(new_nums))
字典
- 什么是字典(dict)
字典是容器型数据类型,将{}作为容器的标志,里面多个元素用逗号隔开(元素必须是键对):
{键1:值1,键2:值2,…}
字典作为容器的特点:字典是可变的(支持增删改);字典是无序的(不支持下标操作)、
元素:必须是键值对;
键 - 必须是不可变的数据(数字、字符串、元组),一般使用字符串;键是用来对值进行描述和区分的
唯一的
值 - 没有要求
空字典
d1 = {}
print(type(d1)) # <class 'dict'>
键是不可变的
d2 = {'name':'小明',10: 100,(1,2):200}
print(d2) # {'name': '小明', 10: 100, (1, 2): 200}
报错,列表不可以作为字典的键(因为列表是可变的)
# d3 = {'name':'小明',[1,2]:200} # TypeError: unhashable type: 'list'
3)键是唯一的
d3 = {'name':'小明','age':18,'name':'张三'}
print(d3) # {'name': '张三', 'age': 18} 后面的会覆盖之前的
4)字典无序
print({'a':10,'b':20} == {'b':20,'a':10}) # True
print([1,2,3] == [3,1,2]) # False
3.字典的增删改查
1)查 - 获取值
1.1)获取元素
a.字典[key] - 获取指定key对应的值
b.
字典.get(key) - 获取指定key对应的值
字典.get(key,value) - 获取指定key对应的值(如果key不存在不会报错,返回指定的默认值)
dog = {'name':'理财','age':2,'sex':'母狗','breed':'土狗'}
print(dog['sex'])
print(dog.get('weight')) # None 用这个在字典中没有改key的时候补货报错就只有none。
print(dog.get('breed','公')) # 当key的时候'公'就可以进去了
print(dog.get('weight',0)) # 0
for 变量 in 字典:
pass
变量依次取到的是字典的key
dog = {'name': '理财', 'age': 2, 'sex': '母狗', 'breed': '土狗'}
for x in dog:
print('x:',x,dog[x]) # 以字典的key作为遍历的元素结果
2)增和改
字典[key] = 值 - 当key存在的时候就是修改指定key的值,当key不存在就是添加键对
dog['name'] = '大黄'
print(dog)
dog['weight'] = 10
print(dog)
3) 删
del 字典[key] - 删除指定key,对应的键对
字典.pop(key) - 获取指定key对应的值(将key获取了之后,因为建队不是成对了,所以也会消失,导致了删除的效果)
dog = {'name': '理财', 'age': 2, 'sex': '母狗', 'breed': '土狗'}
del dog['sex']
print(dog)
a = dog.pop('name')
print(dog, a) # {'age': 2, 'breed': '土狗'} 理财
字典的相关练习
练习:定义一个变量保存一个班级的信息,班级信息主要包含:班级名称、位置、容量、班主任、讲师、所有学生
班主任:姓名、性别、年龄、电话、QQ
讲师:姓名、性别、年龄、电话、QQ、级别
所有学生:多个学生,每个学生包含:姓名、性别、年龄、学历、专业、电话
all_class = {
'name': 'python2004班',
'location': '九教室',
'容量': 50,
'班主任': {
'姓名': '张3',
'性别': '女', '年龄': 40,
'电话': '123',
'qq': '123'},
'讲师': {'姓名': '余婷',
'性别': '女',
'年龄': 40,
'电话': '123',
'qq': '123',
'级别': '高级讲师'},
'students': [
{'姓名': '余婷', '性别': '女', '年龄': 40, '学历': '大学本科', '专业': '电子', '电话': '123'},
{'姓名': '谭飞哥', '性别': '男', '年龄': 20, '学历': '北大博士', '专业': '电新', '电话': '456'}
],
}
print(all_class)
# 获取班主任的名字
# 获取讲师的名字和级别
print(all_class['班主任']['姓名'])
print(all_class['讲师']['姓名'],all_class[ '讲师']['级别'])
# 计算班级所有学生的平均年龄
s = 0
for b in all_class['students']:
s += b['年龄']
num = s/len(all_class['students'])
print(num)
字典的相关操作
字典不支持加法运算、乘法运算、也不支持比较大小
in 和 not in
key in 字典 - 判断字典中是否存在指定的键,而不是给值
d1 = {'a': 30, 'b': '20', 'c': '30'}
print(10 in d1)
print('a' in d1)
字典的类型转换
dict(数据) - 将指定数据转换成字典,数据的要求:
a.数据本身是序列
b.序列中的每个元素必须是长度为2的小序列
c.小序列中的第一个元素是不可变的数据
list(字典) - 将字典转换成列表(将字典的key作为列表的元素)
字典转换成布尔:空字典为False,有内容的字典就是True
print(dict())
#
data = ['ab',(10,20),['abc',123]]
print(dict(data))
d1 = {'a': 30, 'b': '20', 'c': '30'}
print(list(d1))
字典1.update(字典2) - 将字典2中所有的键值对都添加到字典1中
注意: 字典2不一定是字典,也可以是能换成字典的序列
d1 = {'a': 30, 'b': '20', 'c': 30}
d1.update({'name':'章三'})
print(d1) # {'a': 30, 'b': '20', 'c': 30, 'name': '章三'}
d1.update(('nm', [10,20]))
print(d1) # {'a': 30, 'b': '20', 'c': 30, 'name': '章三', 'n': 'm', 10: 20}