Python100day - 06day -元组和字典
元组:
1.什么是元组(tuple)
"""
元组是不可变的列表
元组是容器型类型,将小括号()作为容器的标志,里面多个元素用逗号隔开:(元素1, 元素2, 元素3, ......)
元组不可变(不支持元素的增删改);元组是有序的(支持下标操作)
元素: 任何类型的数据,并且可以重复
"""
t1 = (10, 23, 90, 10)
print(type(t1), t1)
2.只有一个元素的元组 - (元素,)如果元组中只有一个元素,那么唯一的元素后面必须加逗号
t2 = (23,);print(t2)
3.省略括号在没有歧义的情况下可以省略元组的(),直接将多个元素用逗号隔开来表示一个元组
t5 = 'abc', 10, 100, True
print(type(t5), t5) # <class 'tuple'> ('abc', 10, 100, True)
t6 = 10, 20, 30 * 2 # (10, 20, 60)
4.获取元素
1.列表获取元素的方法元组都支持
song = ('葫芦娃', '海阔天空', '霸王别姬', '夜曲', '稻香', '下山')
print(song[1], song[-5]) #海阔天空 海阔天空
print(song[2:]) # ('霸王别姬', '夜曲', '稻香', '下山')
for x in song:
print('x', x)
# x 葫芦娃
# x 海阔天空
# x 霸王别姬
# x 夜曲
# x 稻香
# x 下山
for index, iten in enumerate(song):
print(index, item)
# 0 葫芦娃
# 1 海阔天空
# 2 霸王别姬
# 3 夜曲
# 4 稻香
# 5 下山
for index in range(len(song)):
print(song[index])
# 葫芦娃
# 海阔天空
# 霸王别姬
# 夜曲
# 稻香
# 下山
2.让变量的个数和元组中元素的个数保持一致来获取元组所有元素的值,变量1, 变量2, 变量3, …= 元组
t7 = (10, 102, 32)
x, y, z = t7
print(x, y, z) # 10 102 32
3.同时用多个变量获取元组元素的时候,变量的个数可以比元组中元素的个数少,但是必须有且只有一个变量前有*
stu = ('小明', '男', 30, 89, 70, 170)
m1, m2, *m3 = stu
print(m1, m2, m3) # 小明 男 [30, 89, 70, 170]
m1, *m2, m3 = stu
print(m1, m2, m3) # 小明 ['男', 30, 89, 70] 170
*m1, m2, m3 = stu
print(m1, m2, m3) # ['小明', '男', 30, 89] 70 170
name, sex, *message, height = stu
print(name, sex, height, message) # 小明 男 170 [30, 89, 70]
5.元组的相关操作:列表相关操作元组都支持
t1 = (1, 2, 3)
t2 = ('abc', 'name')
paint(t1 + t2) # (1, 2, 3, 'abc', 'name')
print(t1*3) #(1, 2, 3, 1, 2, 3, 1, 2, 3)
nums = (1, 23, 100, 89, 70)
new_nums = sorted(nums)
print(new_nums) # [1, 23, 70, 89, 100]
print(len(nums)) # 5
print((1, 2, 3, 4, 5) > (10, 0)) # False
print(10 in (1, 2, 3, 4, 5)) # False
print(tuple('abc')) # ('a', 'b', 'c')
print(tuple(range(10, 15))) # (10, 11, 12, 13, 14)
字典:
1.什么时候使用字典:同时保存多个意义不同的数据就使用字典
2.什么是字典(dict)
'''
字典是容器型数据类型,将大括号{}作为容器的标志,
里面多个元素用逗号隔开(元素必须是键值对):{键1: 值1, 键2: 值2, 键3: 值3, .... }
字典是可变的(支持增删改);字典是无序的(不支持下标操作)
元素:必须是键值对;
键 - 必须是不可变的数据(数字、字符串、元组),一般使用字符串;键是用来对值进行描述和区分的
键是唯一的
值 - 没有要求
'''
1.空字典
d1 = {}
print(type(d1)) # <class 'dict'>
2.键是不可变的
d2 = {'name': '小明', 10: 100, (1, 2): 200}
print(d2) # {'name': '小明', 10: 100, (1, 2): 200}
d3 = {'name': '小明', 10: 100, [1, 2]: 200}
print(d3) # 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获取单个值
"""
字典[key] - 获取指定key对应的值(如果key不存在会报错)
字典.get(key) - 获取指定key对应的值(如果key不存在不会报错,返回None)
字典.get(key, 默认值) - 获取指定key对应的值
"""
dog= {'name': '财财', 'age': 2, 'sex': '母狗', 'breed': '土狗'}
print(dog['sex'], dog['name']) # 母狗 财财
print(dog.get('age')) # 2
print(dog.get('breed', '公')) # 土狗
# print((dog['weight'])) # KeyError: 'weight'
print(dog.get('weight')) # None
print(dog.get('weight', 0)) # 0
1.2 遍历
"""
for 变量 in 字典:
pass
注意:变量依次取到的是字典的key
"""
# 键值对离开了字典无效
l1 = [10, 20, 30]
a = 10
d1 = {'a': 10, 'b': 20}
# b = 'a': 10
dog = {'name': '财财', 'age': 2, 'sex': '母狗', 'breed': '土狗'}
for x in dog:
print('x', x)
# x name
# x age
# x sex
# x breed
2.增、改
"""
字典[key] = 值 - 当key存在的时候就是修改指定key对应的值
当key不存在就是添加键值对
"""
dog = {'name': '大黄', 'age': 2, 'sex': '母狗', 'breed': '土狗'}
print(dog) # {'name': '大黄', 'age': 2, 'sex': '母狗', 'breed': '土狗'}
dog['age'] = 3
print(dog) # {'name': '大黄', 'age': 3, 'sex': '母狗', 'breed': '土狗'}
dog['weight'] = 15
# {'name': '大黄', 'age': 3, 'sex': '母狗', 'breed': '土狗', 'weight': 15}
3.删: del 字典[key] - 删除指定key对应的键值对 字典. pop(key) - 取出指定key对应的值
dog = {'name': '大黄', 'age': 2, 'sex': '母狗', 'breed': '土狗'}
del dog['name']
print(dog) # {'age': 2, 'sex': '母狗', 'breed': '土狗'}
dog = {'name': '大黄', 'age': 2, 'sex': '母狗', 'breed': '土狗'}
del_name = dog.pop('name')
print(dog, del_name) # {'age': 2, 'sex': '母狗', 'breed': '土狗'} 大黄
4.字典的实际应用
练习:定义一个变量保存一个班级的信息,班级信息主要包含:班级名称、位置、容量、班主任、讲师、所有学生
班主任:姓名、性别、年龄、电话
讲师:姓名、性别、年龄、电话、QQ、级别
所有学生:多个学生、每个学生包含:姓名、性别、年龄、学历、专业、电话
class1 = {
'name': 'python2004',
'location': '9教室',
'capacity': 50,
'class_teacher': {
'name': '张老师',
'gender': '女',
'age': 30,
'tel': '110',
'qq': '7282233'
},
'teacher': {
'name': '骆昊',
'gender': '男',
'age': 35,
'tel': '172623283',
'qq': '2828332',
'rank': '特级讲师'
},
'students': [
{'name': '小明', 'gender': '男', 'age': 19},
{'name': '小花', 'gender': '女', 'age': 18},
{'name': '张三', 'gender': '男', 'age': 23},
{'name': 'Tom', 'gender': '男', 'age': 22},
{'name': 'Bob', 'gender': '男', 'age': 30}
]
}
# 获取讲师的名字和级别
print(class1['teacher']['name'], class1['teacher']['rank'])
# 计算班级所有学生的平均年龄
students_list = class1['students']
sum1 = 0
for x in class1['students']:
# print('x', x)
# print(x['age'])
sum1 += x['age']
print(sum1/len(students_list)) # 22.4
5.字典相关操作:字典不支持加法、乘法运算,也不支持比较大小
1.in 和 notin key in 字典 - 判断字典中是否存在指定的键
d1 = {'a':10, 'b':20, 'c': 30}
print(10 in d1) # False
print('a' in d1) # True
2.相关函数len、dict
获取长度
print(len(d1)) # 3
字典的类型转换
"""
dict(数据) - 将指定数据转换成字典,数据的要求:
a.数据本身是序列
b.序列中的每个元素必须是长度为2的小序列
c.小序列中的第一个元素是不可变的数据
list(字典) - 将指定字典转换成列表(将字典的key作为列表的元素)
"""
data =['ab',(10, 20), ['abc', 123]]
print(dict(data)) # {'a': 'b', 10: 20, 'abc': 123}
d1 = {'a': 10, 'b':20, 'c': 30}
print(list(d1)) # ['a', 'b', 'c']
3.相关方法
字典.clear() - 清空字典
d1 = {'a': 10, 'b': 20, 'c': 30}
d1.clear()
print(d1) # {}
字典.copy() - 复制字典产生一个一模一样的新字典并返回
d1 = {'a': 10, 'b': 20, 'c': 30}
d2 = d1
d3 = d1.copy()
print(d2) # {'a': 10, 'b': 20, 'c': 30}
d1['c'] = 300
print(d1) # {'a': 10, 'b': 20, 'c': 300}
print(d2) # {'a': 10, 'b': 20, 'c': 300}
print(d3) # {'a': 10, 'b': 20, 'c': 30}
dict.fromkeys(序列) - 创建一个新的字典,键是序列中的元素,值都是None
dict.fromkeys(序列, 值) - 创建一个新的字典,键是序列中的元素,值是指定的值
print(dict.fromkeys('abc')) # {'a': None, 'b': None, 'c': None}
print(dict.fromkeys(['name', 'age', 'sex'])) # {'name': None, 'age': None, 'sex': None}
print(dict.fromkeys('abc', 100)) # {'a': 100, 'b': 100, 'c': 100}
print(dict.fromkeys('abc', [10, 20, 30])) # {'a': [10, 20, 30], 'b': [10, 20, 30], 'c': [10, 20, 30]}
keys、values、items
'''
字典.keys() - 获取字典所有的key(返回值是序列但是不是列表)
字典.values() - 获取字典所有的值(返回值是序列但是不是列表)
字典.items() - 同时获取每个键值对的键和值(返回的值是序列,序列中的元素是元组)
'''
d1 = {'a': 10, 'b': 20, 'c': 30}
print(d1.keys()) # # dict_keys(['a', 'b', 'c'])
print(d1.values()) # dict_values([10, 20, 30])
print(d1.items()) # dict_items([('a', 10), ('b', 20), ('c', 30)])
字典.setdefault(键, 值) - 在字典中添加键对值(只添加不修改)
d1.setdefault('name', '小明')
print(d1) # {'a': 10, 'b': 20, 'c': 30, 'name': '小明'}
d1.setdefault('a', 111)
print(d1) # {'a': 10, 'b': 20, 'c': 30, 'name': '小明'} # 只添加不修改
字典1.update(字典2) - 将字典2中所有的键值对都添加到字典1中 注意:字典2不一定是字典,也可以是能转换成字典的序列
d1 = {'a': 10, 'b': 20, 'c': 30}
d1.update({'name': '张三', 'age': 20})
print(d1) # {'a': 10, 'b': 20, 'c': 30, 'name': '张三', 'age': 20}
d1.update(('nm', [10, 20]))
print(d1) # {'a': 10, 'b': 20, 'c': 30, 'name': '张三', 'age': 20, 'n': 'm', 10: 20}