一、字典:dict
- 里面的元素是一个键值对: key-value
- key有3个特点:
a.唯一
b.不可变类型
c.无序(没有下标)
1.创建字典:
# 创建空字典
d1 = {}
# 创建非空字典
# 方式一:
d2 = {"name": "坤", "age": 22, "height": 184}
print(d2)
#运行结果: {"name": "坤", "age": 22, "height": 184}
'''...................................................'''
#方式二
#dict(key=value),key是一个变量名,value是一个值
dict22 = dict(a="avvv",b="2353")
print(dict22)
dict22 = dict(a=200,b=33)
print(dict22)
#运行结果:
# {'a': 'avvv', 'b': '2353'}
# {'a': 200, 'b': 33}
'''...................................................'''
#方式三:
#dict()和zip(序列),zip表示映射
#dict(zip([key1,key2,key3....],[value1,value2,value3....]))
#注意:key的数量和value的数量可以不一致,以少的作为参考
z1 = zip([1,2],["a","b","c"])
dict23 = dict(z1)
print(dict23)
#运行结果:
# {1: 'a', 2: 'b'}
2.字典查询:
d = {"name": "坤", "age": 22, "height": 184}
print(d['name']) # 方式一
print(d.get('name')) # 方式二
key = "name" # 给key赋值查询
print(d[key])
print(d.get(key))
# print(d['sex']) # 报错,没有key则报错
print(d.get('sex')) # 没有key不报错,但是返回None
print(d.get('sex', "男")) # 没有key不报错,返回默认值
3.遍历字典:
d = {"name": "蔡徐坤", "age": 22, "height": 184}
for k in d:
print(k) # key
# for k in d.keys():
# print(k) # key
for v in d.values():
print(v) # value
for k, v in d.items():
print(k, v) # key value
k = d.keys()
print(k, list(k))
# dict_keys(['name', 'age', 'height']) ['name', 'age', 'height']
4.字典合并:
d1 = {1: 2}
d2 = {3: 4}
d1.update(d2)
# print({1:2} + {3:4}) # 错误 不可以用字典+字典的方式进行合并
print(d1) # {1: 2, 3: 4}
5.字典的增、删、改、查:
# 增
d['sex'] = "男"
print(d) # {'name': '蔡徐坤', 'age': 22, 'height': 184, 'sex': '男'}
# 改
d['age'] = 30
print(d) # {'name': '蔡徐坤', 'age': 30, 'height': 184, 'sex': '男'}
# 删
d.pop('age') # 删除指定key的元素
# d.clear() # 清空字典
# d.popitem() # 删除最后一项,可以认为是随机删除一项, 了解
# del d['age']
print(d)
# 查即为遍历
6.列表与字典之间的区别:
list:
1. 定义方式: [], 一般存放相同类型的数据
2. 内存相对字典较小
3. 数据量较大时, 查找所需时间越久
dict:
1. 定义方式: {}, 一般存放同一个事物的不同属性
2. 内存消耗较大
3. 数据量不管多少, 对查询速度影响不大
二、元组:tuple
元组本质上是一个不可以改变的列表
1. 元组的基本功能:
1)创建元组:
t = () # 空元组
t = (1,) # 包含1个元素的元组
t = (1, 2, 3, "hello", True)
print(t, type(t))
2)元组的合并:
print((1,2) + (3,4)) # (1, 2, 3, 4)
3)元组的重复:
print((1,2,3) * 3) # (1, 2, 3, 1, 2, 3, 1, 2, 3)
4)元组的切片:
t = (1,2,3,4,5,6)
print(t[2:5])
print(t[::-1])
5)元组的遍历:
t = (11, 22, 33)
for n in t:
print(n) # 元素
for i in range(len(t)):
print(i) # 下标
for i,n in enumerate(t):
print(i, n)
2.元组的其他功能:
1)元组的增、删、改、查:
元组与数列不同,无法对元组中的元素进行修改!
t = (11, 22, 33)
# t[0] = 9 # 报错, 不能修改
2)元组排序:
t = (3, 2, 7, 1, 9)
t2 = sorted(t) # 升序
t2 = sorted(t, reverse=True) # 降序
print(t2)
t = (3, 2, 7, 1, 9)
t2 = reversed(t)
print(list(t2))
3)列表和元组的转换
print(list( (1,2,3) )) # [1, 2, 3]
print(tuple( [1,2,3] )) # (1, 2, 3)
4)元组列表快速取值
x, y = (2, 3)
x, y = [2, 3]
print(x, y)
三、集合:set
集合的特点:
- 无序
- 唯一: 不能重复
1.创建集合:
s = {1, 2, 2, 2, 3, 4}
print(s) # {1, 2, 3, 4}
s = set()
print(s) # set() 空集合
2.列表去重:
l = [1, 2, 4, 4, 4, 3, 3, 2, 2, 1, 6, 7, 6]
l2 = list(set(l))
print(l2) # [1, 2, 3, 4, 6, 7]
3.集合的遍历:
s = {11, 22, 33}
for n in s:
print(n)
4.集合的增、删:
# 增
s.add(44)
s.update([55, 66])
print(s)
# {33, 66, 11, 44, 22, 55}
# 删
s.remove(33)
# s.discard(333)
s.clear()
print(s)
5.集合的运算:
s1 = {1, 2, 3, 4}
s2 = {3, 4, 5, 6}
print(s1 & s2) # 交集; {3, 4}
print(s1 | s2) # 并集; {1, 2, 3, 4, 5, 6}
print(s1 - s2) # 差集; {1, 2}
print(s1 ^ s2) # 对称差集; {1, 2, 5, 6}
print(s1 > s2) # s1包含s2; False
print(s1 < s2) # s2包含s1; False
四、排序算法(冒泡排序 & 选择排序)
1.冒泡排序:
原理:
[9,7,6,8,5,4,3,2,1]
第1次(i=0, j=9-i-1) [9,7,6,8,5,4,3,2,1] => [7,6,8,5,4,3,2,1, 9]
第2次(i=1, j=9-i-1) [7,6,8,5,4,3,2,1, 9] => [6,7,5,4,3,2,1, 8,9]
第3次(i=2, j=9-i-1) [6,7,5,4,3,2,1, 8,9] => [6,5,4,3,2,1, 7,8,9]
第4次(i=3, j=9-i-1) [6,5,4,3,2,1, 7,8,9] => [5,4,3,2,1, 6,7,8,9]
第5次(i=4, j=9-i-1) [5,4,3,2,1, 6,7,8,9] => [4,3,2,1, 5,6,7,8,9]
第6次(i=5, j=9-i-1) [4,3,2,1, 5,6,7,8,9] => [3,2,1, 4,5,6,7,8,9]
第7次(i=6, j=9-i-1) [3,2,1, 4,5,6,7,8,9] => [2,1, 3,4,5,6,7,8,9]
第8次(i=7, j=9-i-1) [2,1, 3,4,5,6,7,8,9] => [1, 2,3,4,5,6,7,8,9]
nums = [9,7,6,8,5,4,3,2,1]
for i in range(len(nums)-1): # i=0,1,2,3,4,5,6,7
for j in range(len(nums)-1-i):
if nums[j] > nums[j+1]:
nums[j], nums[j+1] = nums[j+1], nums[j]
print(nums)
2.选择排序:
原理:
[9,7,6,8,5,4,3,2,1]
第1次(i=0) [9,7,6,8,5,4,3,2,1] => [1, 7,6,8,5,4,3,2,9]
第2次(i=1) [1, 7,6,8,5,4,3,2,9] => [1,2, 6,8,5,4,3,7,9]
第3次(i=2) [1,2, 6,8,5,4,3,7,9] => [1,2,3, 8,5,4,6,7,9]
第4次(i=3) [1,2,3, 8,5,4,6,7,9] => [1,2,3,4, 5,8,6,7,9]
第5次(i=4) [1,2,3,4, 5,8,6,7,9] => [1,2,3,4,5, 8,6,7,9]
第6次(i=5) [1,2,3,4,5, 8,6,7,9] => [1,2,3,4,5,6, 8,7,9]
第7次(i=6) [1,2,3,4,5,6, 8,7,9] => [1,2,3,4,5,6,7, 8,9]
第8次(i=7) [1,2,3,4,5,6,7, 8,9] => [1,2,3,4,5,6,7,8, 9]
nums = [9,7,6,8,5,4,3,2,1]
for i in range(len(nums)-1): # i=0,1,2,3,4,5,6,7
# 求剩下数中最小数的下标
min_index = i
for j in range(i, len(nums)):
if nums[j] < nums[min_index]:
min_index = j
# 用最小数和第i个元素交换
nums[i], nums[min_index] = nums[min_index], nums[i]
print(nums)
五、习题
- 声明一个字典保存一个学生的信息,学生信息中包括:
姓名、年龄、成绩(单科)、电话、性别(男、女、不明) - 声明一个列表,在列表中保存6个学生的信息(6个(题1)中的字典)
(1) 统计不及格学生的个数
(2) 打印不及格学生的名字和对应的成绩
(3) 统计未成年学生的个数
(4) 打印手机尾号是8的学生的名字
(5)删除性别不明的所有学生(选做)
上期习题答案:
1.给定一个列表:将列表中指定的某个元素全部删除
ages = [2, 6, 3, 10, 7, 8, 9, 2]
for i in range(0, ages.count(2)):
ages.remove(2)
print(ages)
2.自定义一个列表,最大的与第一个元素交换,最小的与最后一个元素交换,输出列表
ages = [2, 6, 3, 1, 7, 8, 23, 2]
b = 0
# 取得最大列表中最大元素值的下标
c = ages.index(max(ages))
# 取得最小列表中最大元素值的下标
d = ages.index(min(ages))
print(ages)
# 将列表第一个元素存在b中
b = ages[0]
# 将最大元素的值赋给第一个元素
ages[0] = ages[c]
# 将b中存储的元素值赋给最大元素
ages[c] = b
# 将列表最后一个个元素存在b中
b = ages[len(ages)-1]
# 将最小元素的值赋给最后一个元素
ages[len(ages)-1] = ages[d]
# 将b中存储的元素值赋给最小元素
ages[d] = b
print(ages)
3.对称列表. 传入一个列表,元素类型与个数皆未知,返回新列表,由原列表的元素正序反序拼接而成
如传入[“One”, “Two” ,”Three”] 返回[“One”, “Two”, “Three” ,”Three” ,”Two”, “One”]
# 方法一(切片法):
b = list(map(str, input('请输入列表:').split()))
c = b[::-1]
print(b + c)
# 方法二(reverse逆置法):
b = list(map(str, input('请输入列表:').split()))
c = b.copy()
c.reverse()
print(b + c)
4.列表去重, 将下面的列表中重复的元素去除[1,1,1,3,4 ]
# 方法一:
list1 = [1,1,1,3,4 ]
list2 = []
n = len(list1)
for i in range(n):
if list1[i] not in list2:
list2.append(list1[i])
list1 = list2
print(list1)
#方法二:
list1 = [1,1,1,3,4 ]
list1 = list(set(list1))
print(list1)