python-day5-列表的运算及函数
一、列表的运算
(一)列表的重复’*’
代码:
# 1.列表的重复
list1 = [1, 2, 3, 4]
print(list1 * 3)
输出:
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
(二)列表的拼接’+’
代码:
# 2.列表的拼接
list2 = [4, 5, 6, 7]
print(list1 + list2)
输出:
[1, 2, 3, 4, 4, 5, 6, 7]
(三)列表的成员运算
in、not in 结果为布尔值
代码:
# 3.成员运算 in, not in
# 成员运算结果为布尔值
print(3 in [1, 3, 4])
print([3] in [1, 3, 4])
print([3] in [1, 2, 3, [3]])
输出:
True
False
True
(四)比较大小
1.必须为同类型的元素比较大小。
2.比较大小比较的是第一对不相等元素的大小(容器)。
3.数字正常比较大小。
# 4.比较大小
# a.比较大小的元素必须是同类型的
# 不同类型报错:TypeError: '<' not supported between instances of 'str' and 'int'
# b.比较大小比较的是第一对不相等元素的大小(容器)
# c.数字正常比较大小
list1 = [1, 2, 3, 4]
list2 = [1, 2, 4, 5]
# list1 = [1, 2, '3', 4]
# list2 = [1, 2, '4', 5]
# list1 = ['1', 2, '3', 4]
# list2 = [1, 2, '4', 5]
print(list1 < list2)
# TypeError: '<' not supported between instances of 'str' and 'int'
输出:
True
(五)练习
代码:
# 练习:有两个列表A和B,使用列表C来获取两个列表中公共的元素
# 例如: A = [1, 'a', 4, 90] B = ['a', 8, 'j', 1] --> C = [1, 'a']
A = [1, 'a', 4, 90]
B = ['a', 8, 'j', 1]
C = []
for i in A:
if i in B:
C.append(i)
print(C)
输出:
[1, ‘a’]
二、列表的方法和函数
(一)max()、min()
max()、min():获取同类型数据中最大值、最小值。
代码:
# max、min: 获取同类型数据中最大值、最小值
num = [1,2,3,4]
print('最大值为:', max(num))
print('最小值为:', min(num))
# 不是同类型报错
# TypeError: '>' not supported between instances of 'str' and 'int'
输出结果:
最大值为: 4
最小值为: 1
(二)count()
count():统计某个元素出现个数。
代码:
# count: 统计某个元素出现个数
num = [1,2,3,4]
print(num.count(4))
print(num.count(5))
输出结果:
1
0
(三)sum()
sum():求和
代码:
# sum: 求和
num = [1,2,3,4]
print(sum(num))
输出:
10
(四)reverse()
reverse():将列表倒序,返回值为None,直接修改列表本身。
代码:
# reverse: 将列表倒序,返回值为None,直接修改列表本身
num = [1,2,3,4]
print(num.reverse())
print(num)
# 切片倒序
print(num[::-1])
输出:
None
[4, 3, 2, 1]
[1, 2, 3, 4]
(五)sorted()和sort()
sorted():将列表从小到大排序,生成新的列表。
sorted(列表, reverse = False-默认)->从小到大排序
reverse = True:从大到小排序
sort():将列表从小到大排序,修改原列表。
代码:
# sorted:将列表从小到大排序,生成新的列表
# sorted(列表, reverse = False-默认)->从小到大排序
# reverse = True:从大到小排序
# sort:将列表从小到大排序,修改原列表
num1 = [23, 78, 0, 80]
print(sorted(num1))
# 从大到小
print(sorted(num1, reverse=True))
print(num1)
print(num1.sort())
print(num1)
print(num1.sort(reverse=True))
print(num1)
输出:
[0, 23, 78, 80]
[80, 78, 23, 0]
[23, 78, 0, 80]
None
[0, 23, 78, 80]
None
[80, 78, 23, 0]
(六)extend()
extend():将一个容器中的元素添加到列表中。
代码:
# extend(): 将一个容器中的元素添加到列表中
num1 = [80, 78, 23, 0]
num1.extend('abcdea')
num1.extend([1,2,3])
print(num1)
输出:
[80, 78, 23, 0, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘a’, 1, 2, 3]
(七)index()
index():查找元素。
1.从左向右查找,找到元素立刻停止,返回下标。
2.如果查找元素不存在,报错。
代码:
# index:查找元素
# 从左向右查找,找到元素立刻停止,返回下标。
# 如果查找元素不存在,报错。
index1 = num1.index('a')
# print(index1)
# 指定从下标为5的位置开始查找
index1 = num1.index('a', 5)
print(index1)
# ValueError: 'a' is not in list
打印结果:
9
3.不使用index方法查找第二个a的下标。
# 练习:不使用index(), 查找第二个a的下标
num1 = [80, 78, 23, 0, 'a', 'b', 'c', 'd', 'e', 'a', 1, 2, 3]
a_count = 0
for i in range(len(num1)):
if num1[i] == 'a':
a_count += 1
if a_count == 2:
print(i)
break
三、列表去重
题目:有一个列表,要求去掉重复的人名
例如:names = [‘张三’, ‘李四’, ‘大黄’, ‘张三’,‘张三’]
-> names = [‘张三’, ‘李四’, ‘大黄’']
# 方法一:not in
print('方法一:')
names = ['张三', '李四', '大黄', '张三','张三']
name_list = []
for i in names:
if i not in name_list:
name_list.append(i)
print(name_list)
# 方法二:倒着比较
print('方法二:')
names = ['张三', '李四', '大黄', '张三','张三', '李四', '李四']
for i in range(len(names) - 1, -1, -1):
print(i, names)
if names.count(names[i]) > 1:
del names[i]
print(names)
# 方法三:while
print('方法三:')
names = ['张三', '李四', '大黄', '张三','张三', '李四', '李四']
index = 0
while index <= len(names) - 1:
if names.count(names[index]) > 1:
del names[index]
else:
index += 1
print(index)
print(names)
打印结果:
方法一:
[‘张三’, ‘李四’, ‘大黄’]
方法二:
6 [‘张三’, ‘李四’, ‘大黄’, ‘张三’, ‘张三’, ‘李四’, ‘李四’]
5 [‘张三’, ‘李四’, ‘大黄’, ‘张三’, ‘张三’, ‘李四’]
4 [‘张三’, ‘李四’, ‘大黄’, ‘张三’, ‘张三’]
3 [‘张三’, ‘李四’, ‘大黄’, ‘张三’]
2 [‘张三’, ‘李四’, ‘大黄’]
1 [‘张三’, ‘李四’, ‘大黄’]
0 [‘张三’, ‘李四’, ‘大黄’]
[‘张三’, ‘李四’, ‘大黄’]
方法三:
3
[‘大黄’, ‘张三’, ‘李四’]
四、列表推导式
(一)作用
生成一个有元素的列表。
append()适用于所有向列表中追加元素的操作。
列表推导式在某些情况下可以替代append()
性能:列表推导式 > append()
代码:
# 列表推导式和append性能对比:
import time
start = time.time()
list1 = []
for i in range(1, 10000001):
list1.append(i)
end = time.time()
print(f'append方法一共花费{end - start}秒')
start = time.time()
list2 = [i for i in range(1, 10000001)]
end = time.time()
print(f'列表推导式方法一共花费{end - start}秒')
打印结果:
append方法一共花费4.56853175163269秒
列表推导式方法一共花费1.8915929794311523秒
(二)语法一
[表达式 for 变量 in 容器]:
for循环每执行一次,表达式就会将其生成的结果添加到列表中。
代码:
1.[表达式 for 变量 in 容器]
# for循环每执行一次,表达式就会将其生成的结果添加到列表中。
num = [i for i in range(1, 101)]
print(num)
# 添加十个1
num_2 = [1 for _ in range(10)]
print(num_2)
打印结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
(三)语法二
[表达式 for 变量 in 容器 if 条件]:
for循环执行一次,if分支判断一次,条件成立时表达式执行。
输出1-100的所有偶数
代码:
# 2.[表达式 for 变量 in 容器 if 条件]
# for循环执行一次,if分支判断一次,条件成立时表达式执行。
list3 = [i for i in range(1, 101) if i % 2 == 0]
print(list3)
输出结果:
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
(四)语法三
[表达式 for 变量 in 容器 for 变量 in 容器]
代码:
# 3.[表达式 for 变量 in 容器 for 变量 in 容器]
list4 = [i for _ in range(3) for i in range(1,11)]
print(list4)
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
(五)练习
题目:孪生数:两个素数的差等于2。找出100以内所有的孪生数。
代码:
list = []
for i in range(2, 101):
if i == 2:
print('2是素数')
list.append(2)
else:
# 判断2到x-1中有没有能将x整除的元素。
for j in range(2, i):
if i % j == 0:
# print(f'{i}不是素数')
break
else:
# print(f'{i}是素数')
list.append(i)
print('素数:', list)
for x in range(len(list) - 1):
if list[x + 1] - list[x] == 2:
print(f'{list[x]}和{list[x + 1]}是孪生数')
输出结果:
2是素数
素数: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
3和5是孪生数
5和7是孪生数
11和13是孪生数
17和19是孪生数
29和31是孪生数
41和43是孪生数
59和61是孪生数
71和73是孪生数
五、random随机模块
首先都要导入随机模块的包。
随机函数生成的都是随机的,不是固定的。
import random
(一)randint(a, b), randrange()
randint(a, b): 从[a,b]闭区间中随机获取一个整数。
randrange(): 约等于randint + range。
import random
# randint(a, b):从[a,b]闭区间中随机获取一个整数。
# randrange(): 约等于randint + range
print(random.randrange(1, 4, 2))
输出结果:
3
(二)choice()
choice():从容器中随机获取一个元素。
import random
# choice():从容器中随机获取一个元素
print(random.choice([1, 2, 3, 4]))
输出结果:
2
(三)choices()
choices(): 从容器中随机获取k个元素,有放回的抽取元素。
import random
# choices(): 从容器中随机获取k个元素,有放回的抽取元素
print(random.choices([1, 2, 3, 4, 5], k=3))
输出结果:
[5, 3, 5]
(四)sample()
sample(): 从有序容器中无放回的抽取k个元素。
import random
# sample(): 从有序容器中无放回的抽取k个元素
print(random.sample([1, 2, 3, 4], k=3))
输出结果:
[4, 2, 3]
(五)shuffle()
shuffle(): 将有序容器随机打乱顺序,无返回值。
import random
# shuffle(): 将有序容器随机打乱顺序,无返回值
list = [1,2,3,4]
print(random.shuffle(list)) # None
print(list)
输出结果(随机的):
None
[3, 1, 2, 4]
(六)练习:课堂点名器
import random
# 练习:课堂点名器
names = ['付永康', '廖宇', '罗梦佳', '夏博林']
random.shuffle(names)
result = random.choices(names, k = 1)
print(f'被抽中的同学为:{result}')
输出结果:
被抽中的同学为:[‘廖宇’]