列表续和字典
-
列表推导式
1)序列变换列表str1 = 'abc' list1 = [x for x in str1] print(list1) # ['a', 'b', 'c'] nums = [11, 22, 33, 44] list2 = [x*100 for x in nums] print(list2) # [1100, 2200, 3300, 4400] list3 = [x % 10 for x in nums] print(list3) # [1, 2, 3, 4]
- 筛选(提取出有效的或者删除无效)
scores = [89, 10, 20, 60, 70, 80, 85, 90] new_scores = [x for x in scores if x >= 60] print(new_scores) # [89, 60, 70, 80, 85, 90]
3)不统一的变换
list4 = [19, 'abc', 98, 'hh', 13, 53] # -> [190, 'abc', 980, 'hh', 130, 530] new_list4 = [x*10 if type(x) == int else x for x in list4] print(new_list4)
-
列表的加法和乘法
- 列表1 + 列表2 - 合并两个列表产生一个新的列表
a = [1, 2, 3] b = ["亚索", "盲僧"] result = a + b print(result) # [1, 2, 3, '亚索', '盲僧']
-
列表 * N - 列表中的元素重复N次产生一个新的列表
a = [1, 2, 3] result1 = a * 3 print(result1) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
-
比较运算
1)比较相等 ==、!=
-
元素顺序不同的两个列表不相等
print([1, 2, 3] == [1, 2, 3]) # True print([1, 2, 3] == [1, 3, 2]) # False
-
两个不同类型的数据可以判断是否相等,但结果一定是False
print([1, 2] == 'abc') # False print([1, 2] == '[1, 2]') # False print(['a', 'b'] == 'ab') # False
-
is的用法
is的实质是判断两个数据的空间地址是否一样
print("is:", 2 is 2) # True print('abc' is 'abc') # True print("is:", [1, 2] is [1, 2], [1, 2] == [1, 2])
注:
list1 = [110, 120] list2 = [110, 120] print(list1 is list2) # False list1 = [100, 200] list2 = list1 # 赋值一定是赋地址 等价于 b = &a print(list1 is list2) # True
结论1:用数据给变量赋值的时候,如果数据是不可变,那么会复用前面存储的值。
如果数据可变,不管之前有没有存储过,都会重新开辟新的内容空间
id(变量) - 获取变量中保存的数据的内容空间中的地址a = 100 b = 100 print(id(a),id(b)) # 140710905766016 140710905766016
例:
# 列表可变 a = [10, 20] b = [10, 20] print(id(a),id(b)) # 2665317834120 2665317601352 # 元组不可变 a = (10, 20) b = (10, 20) print(id(a),id(b)) # 2665314367752 2665314367752 # 字典可变 a = {'a': 10} b = {'a': 10} print(id(a),id(b)) # 2092780802624 2092780802120
结论2:如果用一个变量给另外一个变量赋值,其实是让新的变量保存原变量中的数据的地址
即不会开辟新的空间保存数据a = 100 b = a print(id(a), id(b)) # 140710905766016 140710905766016 a = [10, 20] b = a print(id(a), id(b)) # 1776360341448 1776360341448
结论3:python中所有的变量都是指针变量。
-
列表相关函数
-
相关函数
max、min、sun、sorted、len、list
1)max和minmax(序列) - 返回列表元素的最大值
min(序列) - 返回列表元素的最小值nums = [90, 89, 67, 29, 789, 2] print(max(nums)) print(min(nums))
2)sum
sum(序列) - 求序列中所有元素的和(序列中的元素只能是数字)
print(sum(nums)) print(sum(range(101)))
3)sorted
sorted(序列) - 将序列中的元素从小到大排序(升序),以列表的形式返回
sorted(序列, reverse = True) - 将序列元素从大到小排序(降序),以列表形式返回nums = [90, 89, 67, 29, 789, 2] new_nums = sorted(nums) print(new_nums) # [2, 29, 67, 89, 90, 789] new_nums = sorted(nums, reverse=True) print(new_nums) # [789, 90, 89, 67, 29, 2]
- list
list()
list(序列) - 将其他的序列转化成列表(任何序列都可以转换成列表)list1 = list('abc') print(list1) # ['a', 'b', 'c'] list2 = list(range(5, 11)) print(list2) # [5, 6, 7, 8, 9, 10]
-
相关方法
列表.xxx()
1)列表.clear() - 删除列表中的所有的元素song = ['非主流', '杀马特', '洗剪吹'] song.clear() print(song) # []
2)列表.copy() - 返回一个和原列表一样(长得一样)的新列表
列表[:]、列表+[]、列表*1song = ['非主流', '杀马特', '洗剪吹', '老司机带带我'] song2 = song.copy() print(song2) # ['非主流', '杀马特', '洗剪吹', '老司机带带我'] song3 = song print(song3) # ['非主流', '杀马特', '洗剪吹', '老司机带带我'] song.append(100) print(song3) # ['非主流', '杀马特', '洗剪吹', '老司机带带我'] print(song2) # ['非主流', '杀马特', '洗剪吹', '老司机带带我']
- 列表.count(元素) - 返回元素在列表中出现的次数
nums = [34, 15, 84, 8848, 4, 5, 15, 16, 15, 17, 15] print(nums.count(15)) # 4 print(nums.count(100)) # 0
- 列表.extend(序列) - 将序列中的元素全部添加到列表中
song = ['非主流', '杀马特', '洗剪吹', '老司机带带我'] song.extend(['葬爱', '杀鸡']) print(song) # ['非主流', '杀马特', '洗剪吹', '老司机带带我', '葬爱', '杀鸡'] song.extend(range(1,3)) print(song) # ['非主流', '杀马特', '洗剪吹', '老司机带带我', '葬爱', '杀鸡', 1, 2]
5)列表.index(元素) - 返回元素在列表中的下标(这的下标是0开始的下标值)
song = ['非主流', '杀马特', '洗剪吹', '老司机带带我'] print(song.index('洗剪吹')) # 2 song = ['非主流', '杀马特', '洗剪吹', '老司机带带我', '洗剪吹'] print(song.index('洗剪吹')) # 2 # print(song.index('马杀鸡')) # ValueError: '马杀鸡' is not in list
6)列表.reverse() - 列表逆序
song = ['非主流', '杀马特', '洗剪吹', '老司机带带我', '洗剪吹'] song.reverse() print(song) # ['洗剪吹', '老司机带带我', '洗剪吹', '杀马特', '非主流'] 方法一 song = ['非主流', '杀马特', '洗剪吹', '老司机带带我', '洗剪吹'] new_song = song[::-1] print(new_song) # ['洗剪吹', '老司机带带我', '洗剪吹', '杀马特', '非主流'] 方法二
7)列表.sort()
nums = [90, 77, 100, 54, 64, 81] nums.sort() print(nums) # [54, 64, 77, 81, 90, 100] nums = [90, 77, 100, 54, 64, 81] new_nums = sorted(nums) print(nums) # [90, 77, 100, 54, 64, 81] print(new_nums) # [54, 64, 77, 81, 90, 100]
字典
问题引入:定义一个变量同时保存一个学生的姓名、年龄、身高、体重、分数
用列表:
student = ['迪迦', 30, 178, 70, 89]
print(student[0])
用字典:
student = {'name': '小明', 'age': 30, 'height': 178, 'weight': 70, 'score': 89}
print(student['name'], student['height']) # 小明 178
1. 什么是字典?(dict)
1)字典是容器型数据类型,将{}作为容器的标志,里面多个元素,{元素都是键值对}用逗号隔开:{键1:值1, 键2:值2, 键3:值3,…}
注意:字典保存数据,其实是想要保存的是值,键的作用是对值进行区分说明的。
2)字典可变(支持增删改);字典是无序的(不支持下标操作)
3)字典的元素 - 必须是键值对
键 - 必须是不可变的数据(一般使用字符串)、唯一的
值 - 任何类型的数据都可以、可以重复
- {}是空字典
dict1 = {}
print(dict1, type(dict1)) # {} <class 'dict'>
-
不可变的数据才能作为键
dict2 = {10: 100, 12.5: 200, 'name': '张三', True: 300} print(dict2) # {10: 100, 12.5: 200, 'name': '张三', True: 300}
-
键是唯一的
dict4 = {10:100, 20: 200, 10: 300} # 自动去掉重复的键值对,通常覆盖前面的。 print(dict4) # {10: 300, 20: 200}
-
实际开发中的字典:
students = [ {'name': '面筋哥', 'age': 18, 'gender': '男', 'tel':'120'}, {'name': '波澜哥', 'age': 19, 'gender': '男', 'tel':'110'}, {'name': '犀利哥', 'age': 20, 'gender': '男', 'tel':'119'}, ]
练习:定义一个变量保存一条狗的信息
dog = {'name': '小明', 'age': 22, 'sex': '男', 'height':180, 'weight':60, 'girlfriend':{
'name': '小红', 'age': 18, 'sex': '女', 'height': 170, 'weight': 50,
}
}
print(dog)
print(dog['girlfriend'])
2.字典的增删改查
1.查 - 获取字典的值
1)获取单个值
a.字典[key] - 获取字典中指定key对应的值
b.字典.get(key) - 获取字典中指定key对应的值
c.字典。get(key, 默认值)
film = {'name': '赛罗奥特曼', 'director': '圆谷', 'time':'2008'}
print(film['name']) # 赛罗奥特曼
print(film['time']) # 2008
# print(film['age']) # 报错:KeyError: 'age'
print(film.get('name')) # 赛罗奥特曼
print(film.get('time')) # 2008
print(film.get('age')) # None
print(film.get('name', 0)) # 赛罗奥特曼
print(film.get('time', 0)) # 2008
print(film.get('age', 0)) # 0
2)遍历
for-in 遍历字典的是,变量渠道的是字典的键
film = {'name': '赛罗奥特曼', 'director': '圆谷', 'time':'2008'}
for x in film:
print(x, end=' ') # name director time
print()
for x in film:
print(x, film[x], end=' ')
练习:定义一个变量保存一个班所有的学生信息,每个学生中包含姓名、年龄、性别、电话号码
①计算这个这个班的学生的平均年龄
②统计班级中女生的个数
students = [
{'name': 'stu1', 'age': 18, 'gender': '男', 'tel': '1101'},
{'name': 'stu2', 'age': 22, 'gender': '女', 'tel': '1104'},
{'name': 'stu3', 'age': 30, 'gender': '女', 'tel': '1102'},
{'name': 'stu4', 'age': 23, 'gender': '男', 'tel': '1106'},
{'name': 'stu5', 'age': 24, 'gender': '男', 'tel': '1109'},
{'name': 'stu6', 'age': 16, 'gender': '女', 'tel': '1100'}
]
ages = 0
girls = 0
for x in range(len(students)):
if students[x]['gender'] == '女':
girls += 1
ages += students[x]['age']
print("女生有{}个,平均年龄为{:.2f}".format(girls, ages/len(students))) # 方法一
ages = 0
girls = 0
for stu in students:
if stu['gender'] == '女':
girls += 1
ages += stu['age']
print("女生有{}个,平均年龄为{:.2f}".format(girls, ages/len(students))) # 方法二
avg_age = sum([x['age'] for x in students]) / len(students)
print(avg_age)
girls = [x['gender'] for x in students].count('女')
print(girls) # 方法三 递推式
-
增、改
字典[key] = 值 - 当key存在的时候键是修改;当key不存在的时候键是增加computer = {'price': 5432, 'brand': '联想'} print(computer) # {'price': 5432, 'brand': '联想'} computer['color'] = '白色' print(computer) # {'price': 5432, 'brand': '联想', 'color': '白色'} computer['price'] = 3000 print(computer) # {'price': 3000, 'brand': '联想', 'color': '白色'}
-
删
del 字典[key] - 删除字典指定key对应的键值对。 (key不存在则报错)computer = {'price': 3000, 'brand': '联想', 'color': '白色'} del computer['price'] print(computer) # {'brand': '联想', 'color': '白色'} # 2)字典.pop(key) - 取出字典中指定key对应的值 computer = {'price': 3000, 'brand': '联想', 'color': '白色'} price = computer.pop('price') print(computer, price) # {'brand': '联想', 'color': '白色'} 3000
3. 字典的相关操作和方法
dict1 = {'a': 10, 'b': 20, 'c': 30}
print(10 in dict1) # False
print('a' in dict1) # True
- 字典的max、min、sum、sort
print(max(dict1)) # c
-
dict
dict(序列) - 将序列转换成字典
序列的要求:a.序列中每个元素都是序列
b.小序列有且只有两个元素
c.小序列中的第一个不可变seq = ['ab', '12', 'a1'] print(dict(seq)) # {'a': '1', '1': '2'} 注意:此时的'a'是ASCII码 seq = [range(2), ['name', '小明']] print(dict(seq)) # {0: 1, 'name': '小明'}
-
字典转列表(所有序列都可以转换成列表)
dict1 = {'a': 10, 'b': 20, 'c': 30} print(list(dict1)) # ['a', 'b', 'c']