06 容器型数据类型------列表
容器型数据类型
容器型数据类型:用一个变量可以保存多个数据的数据类型,包括列表(list)
、元组(tuple)
、集合(set)
、字典(dict)
。
列表
- 列表是python提供的一种容器型数据类型;以[]作为容器的标志,里面多个元素用逗号隔开:[元素1, 元素2, 元素3, …]。
- 列表是可变的(元素个数、元素的值可变),元素支持增、删、改、查操作。
- 列表是有序的、支持下标操作。
列表元素
- 列表中的元素可以是任何类型的数据;同一列表中元素的类型可以不一样。
- 列表的增、删、查、改、切片操作。
- 列表的运算(拼接、重复、成员、索引、切片、比较)。
- 列表元素的循环遍历。
- 列表的统计、排序方法。
- 列表的生成式(推导式)语法。
列表元素的添加与删除
"""
example01 - 容器型数据类型(用一个变量可以保存多个数据)---列表
Author: yucui
Date: 2021/7/23
"""
list1 = [] # 空列表
print(list1)
nums = [10, 100, 1000, ]
print(nums)
print(type(nums))
li = [1, 'hello', '学习', True, 3.2, 'hello'] # 列表元素类型可以不一样
print(li)
print(type(li))
nums.append(10000) # 在列表尾部追加数据
print(nums)
nums.insert(1, 15) # 指定位置插入
print(nums)
get_num = nums.pop() # 取出最后一个元素,列表中会删除这个元素,但是这个值仍然存在
print(get_num, nums)
li.remove('hello') # 删除指定元素
print(li)
del li[2] # 删除指定下标对应的元素
print(li)
# 清空列表元素
li.clear()
print(li)
说明:列表元素添加方法有两种:一种是使用
列表.append()
函数在列表尾部追加数据;另一种是使用列表.insert()
函数在指定位置插入,列表.insert()
函数有两个参数,第一个参数是下标,第二个参数是要插入的值,表示在指定下标前插入指定元素。列表的删除方法有三种,一种是使用列表.pop()
,表示取出最后一个元素,这个元素还存在,但是列表中删除了这个元素;一种是使用列表.remove()
,可以删除指定元素值的元素;还有一种是del
函数,可以删除指定下标对应的元素。清空列表元素可以使用列表.clear()
。
运行结果如下:
[]
[10, 100, 1000]
<class 'list'>
[1, 'hello', '学习', True, 3.2, 'hello']
<class 'list'>
[10, 100, 1000, 10000]
[10, 15, 100, 1000, 10000]
10000 [10, 15, 100, 1000]
1 ['hello', '学习', True, 3.2, 'hello']
['学习', True, 3.2, 'hello']
['学习', True, 'hello']
[]
列表的切片操作
"""
example05 - 列表的切片操作
切片语法 ---> list_obj[start:end:step]
Author: yucui
Date: 2021/7/26
"""
nums = [35, 12, 54, 90, 37, 45, 23, 35]
print(nums[2:]) # 取到从第三个元素到最后一个元素
print(nums[:]) # 取到所有元素
print(nums[::-1]) # 从最后一个元素往前取(反转列表)
print(nums[1:3]) # 取到第二个、第三个
print(nums[2:6:2]) # 从第三个开始到第7个,每隔一个取一个
# print(nums[10]) # 下标越界,会报错
print(nums[10:15]) # 产生空列表,不会报错
print(nums[5:1]) # 产生空列表,不会报错
运行结果:
[54, 90, 37, 45, 23, 35]
[35, 12, 54, 90, 37, 45, 23, 35]
[35, 23, 45, 37, 90, 54, 12, 35]
[12, 54]
[54, 37]
[]
[]
列表的遍历
"""
example02 - 列表的遍历
索引运算(下标运算) - 通过正向或负向获取列表的值
Author: yucui
Date: 2021/7/23
"""
nums = [35, 98, 12, 27, 66]
print(nums[2], nums[-3]) # 根据下标取值
nums[1] = 50 # 修改指定元素的值
print(nums)
for num in nums: # 只能读列表元素
print(num, end=' ')
print()
for i in range(len(nums)): # 既能读元素,也能通过下标修改元素
nums[i] += 10
print(nums[i], end=' ')
print()
for index, num in enumerate(nums): # 可以取两个值,索引值和元素
print(index, num)
说明:每个元素都对应两个下标,一个正的下标,一个负的下标,正的从前往后,从0到列表长度减一,负的从后往前,从-1到负的列表长度,查找元素时,可以根据元素下标获取元素的值。列表的遍历有两种形式,一种是直接遍历,但是这种遍历方式比较局限,只能读取,不能修改元素的值,而通过遍历下标来遍历列表就比较方便,既可以读取元素,还可以修改元素的值。枚举函数
enumerate()
函数既可以取到元素,也可以取到元素的下标值。
运行结果如下:
12 12
[35, 50, 12, 27, 66]
35 50 12 27 66
45 60 22 37 76
0 45
1 60
2 22
3 37
4 76
列表的统计方法
"""
example03 - 输入10个整数,计算平均值、方差,找出最大值、最小值
Author: yucui
Date: 2021/7/23
"""
nums = []
for _ in range(10):
num = int(input('请输入:'))
nums.append(num)
print(nums)
max_num = max(nums)
min_num = min(nums)
average = sum(nums) / len(nums)
total = 0
for i in range(len(nums)):
total += (nums[i] - average) ** 2
variance = total / (len(nums) - 1) # 方差
print(f'平均值:{average},方差:{variance},最大值:{max_num},最小值:{min_num}')
说明:可以使用
sum()
函数对列表元素求和。 使用
max()
函数求出列表元素中最大的值。 使用
min()
函数求列表中最小的值。 使用
len()
函数求列表的长度。
列表的生成式(推导式语法)
"""
example04 - 列表的生成式(推导式语法)
Author: yucui
Date: 2021/7/26
"""
nums = [i for i in range(1, 11)]
print(nums)
运行结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
列表的运算
"""
example06 - 列表的运算
Author: yucui
Date: 2021/7/26
"""
list1 = ['apple', 'pear', 'orange', 'strawberry', 'apple'] # 创建列表的方式一:字面量语法
print(list1)
list2 = list(range(1, 11)) # 创建列表的方式二:构造器语法
print(list2)
list3 = [i ** 2 for i in range(1, 11)] # 创建列表的方式三:生成式(推导式)语法
print(list3)
# count() ---> 计算元素出现次数
print(list1.count('apple'))
# index() ---> 查找元素位置
print(list1.index('pear'))
print(list1.index('apple'))
print(list1.index('apple', 1)) # 从下标1开始找,找到的是第二个apple的下标
# 获取列表元素的个数
print(len(list1))
print(len(list2))
# 和列表相关的运算
# 重复运算
list4 = [1, 10, 100] * 5
print(list4)
# 成员运算
print(10 in list4)
print(5 in list4)
print(5 not in list4)
# 索引和切片
# 正向索引:0 ~ n - 1 / 负向索引:-n ~ -1
# 索引运算
print(list1[0])
print(list1[-1])
# 切片运算
print(list2[1:5])
print(list2[:])
print(list2[::2])
print(list2[-1:-5:-1])
print(list2[-5:-1])
# 合并
list5 = [1, 3, 5, 7]
list6 = [4, 4, 8]
temp = list5 + list6
print(temp)
# 比较
list7 = list(range(1, 8, 2))
list8 = [1, 3, 5, 7, 9]
list9 = [1, 3, 5, 9]
# 比较两个列表元素是否一一相等
print(list5 == list7)
print(list7 == list8)
# 比较两个列表对应元素大小
print(list7 > list8)
print(list8 > list9)
运行结果:
['apple', 'pear', 'orange', 'strawberry', 'apple']
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
2
1
0
4
5
10
[1, 10, 100, 1, 10, 100, 1, 10, 100, 1, 10, 100, 1, 10, 100]
True
False
True
apple
apple
[2, 3, 4, 5]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 3, 5, 7, 9]
[10, 9, 8, 7]
[6, 7, 8, 9]
[1, 3, 5, 7, 4, 4, 8]
True
False
False
False
列表的反转和排序
"""
example07 - 列表的反转和排序
Author: yucui
Date: 2021/7/26
"""
# 列表的反转
items = [1, 15, 0, 25, 69]
items.reverse()
print(items)
# 列表的排序 默认为升序 修改reverse=True,排序方式为降序
items.sort(reverse=True)
print(items)
nums = ['1', '10', '234', '2', '35', '100']
nums.sort()
print(nums)
nums.sort(key=int)
print(nums)
运行结果:
[69, 25, 0, 15, 1]
[69, 25, 15, 1, 0]
['1', '10', '100', '2', '234', '35']
['1', '2', '10', '35', '100', '234']
课后练习
输入三个整数,按照从大到小顺序输出
"""
exersice1 - 输入三个整数,按照从大到小的顺序输出
Author: yucui
Date: 2021/7/24
"""
nums = []
for _ in range(3):
num = int(input('请输入:'))
nums.append(num)
sort_nums = sorted(nums, reverse=True)
for i in sort_nums:
print(i, end=' ')
说明:python中的内置函数
sorted()
函数是一个排序函数,reverse参数值为True,表示降序排列
运行结果如下:
请输入:12
请输入:35
请输入:9
35 12 9
向列表添加10个随机整数,找出其中第二大的元素
"""
exercise2 - 向列表中添加10个随机整数,找出其中第2大的元素
Author: yucui
Date: 2021/7/24
"""
import random
# 列表的生成式语法(推导式语法)
nums = [random.randrange(1, 101) for _ in range(10)]
max1, max2 = nums[0], nums[1]
if max1 < max2:
max1, max2 = max2, max1
# 找到最大和第二大的元素
for i in range(3, len(nums)):
if nums[i] > max1:
max1, max2 = nums[i], max1
# 如果最大的元素不止一个,就跳过不做处理,继续下一轮循环
elif nums[i] == max1:
continue
elif nums[i] > max2:
max2 = nums[i]
print(nums)
print(max2)
运行结果不唯一,因为是产生随机数进行排序,运行结果如下:
[66, 1, 66, 31, 8, 64, 71, 88, 44, 9]
71
21根火柴游戏:有21根火柴,人和计算机轮流拿,人先拿(输入拿几根)计算机后拿,每次至少1根最多4根,拿到最后一根火柴的算输,要确保计算机一定可以获胜!
"""
exercise3 - 21根火柴游戏
Author: yucui
Date: 2021/7/24
"""
total = 21
while total > 0:
n = int(input('人取火柴(1-4)根:'))
total -= n
print(f'还剩{total}根')
if total > 0:
com_get = 5 - n
total -= com_get
print(f'计算机取{com_get}根,还剩{total}根')
print('人输了')
思路:一共21根火柴,要保证计算机赢,就得保证最后一根是人拿到,前面还有20根,在每一轮拿火柴时,人拿n根,计算机就拿5-n根,一共能进行4轮,这样就能保证最后一根是人拿到。
4 3 2 1 人
1 2 3 4 计算机
1 2 3 4 人
4 3 2 1 计算机
1 2 3 4 人
4 3 2 1 计算机
4 3 2 1 人
1 2 3 4 计算机
1 1 1 1 人
运行结果:
人取火柴(1-4)根:4
还剩17根
计算机取1根,还剩16根
人取火柴(1-4)根:3
还剩13根
计算机取2根,还剩11根
人取火柴(1-4)根:2
还剩9根
计算机取3根,还剩6根
人取火柴(1-4)根:2
还剩4根
计算机取3根,还剩1根
人取火柴(1-4)根:1
还剩0根
人输了