Python中容器型数据类型有
列表
、
元组
、
字符串
、
集合
、
字典
。
可变性
列表
、集合
、字典
是可变的,元组
、字符串
不可变。集合
支持添加、删除元素操作,不支持修改操作,因为集合是无序的,不能使用下标访问元素。列表
和字典
支持增删改查操作,列表可以通过遍历整个列表,获取所有元素,也可以通过下标获取指定元素;字典通过键获取对应的值,也可以通过遍历字典获取键值对。元组
、字符串
不支持增删改操作。
# 列表
list1 = ['apple', 'banana', 'pear', 'peach', 'apple']
nums = [100, 15, 20]
# 追加元素
list1.append('strawberry')
# 插入元素
list1.insert(1, 'watermelon')
print(list1)
# 修改元素
list1[0] = 'grape'
print(list1)
# 删除元素
print(nums.pop()) # 删除最后一个元素
nums.pop(0) # 根据下标删除指定元素
print(nums)
# 清空元素
list1.clear()
print(list1)
# 集合
set1 = {'apple', 'banana', 'pear', 'peach', 'apple'}
# 添加元素
set1.add('strawberry')
print(set1)
# 删除元素
set1.discard('banana') # 指定元素删除
print(set1.pop()) # 随机删除
print(set1)
# 清空元素
set1.clear()
print(set1)
# 字典
price = {'apple': 7, 'banana': 5, 'pear': 3.5, 'peach': 5}
# 添加键值对
price['grape'] = 15
# 修改值
price['apple'] = 6.5
# 删除键值对
print(price.pop('banana'))
print(price)
del price['pear']
print(price)
# 清空键值对
price.clear()
print(price)
有序性
列表
、元组
、字符串
是有序的,可以通过下标查找元素。列表可以通过遍历整个列表,获取所有元素,也可以通过下标获取指定元素;字典
、集合
是无序的,不能通过下标获取元素。字典可以通过遍历字典获取键值对,也可以通过遍历字典的键、或值获取值,还可以通过遍历键值对获取键值对;集合可以通过遍历整个集合获取元素。
# 列表
list1 = ['apple', 'banana', 'pear', 'peach', 'apple']
# 下标操作
print(list1[0], list1[-2])
# 元组
tuple1 = ('apple', 'banana', 'pear', 'peach', 'apple')
# 下标操作
print(tuple1[2], tuple1[-3])
# 字符串
str1 = 'i love eating oranges very much'
# 下标操作
print(str1[7])
列表,元组和字符串都支持两种循环遍历,一种是直接遍历(遍历整个列表、元组、字符串),另一种是遍历元素下标,通过下标获取元素值。并且列表、元组、字符串支持切片操作,此处不再详述。
# 字典
price = {'apple': 7, 'banana': 5, 'pear': 3.5, 'peach': 5}
# 通过键获取值
print(price['pear'])
# 循环遍历
# 循环遍历键值对获取键和值
for fruit, value in price.items():
print(fruit, value)
# 循环遍历键,获取值
for fruit in price:
print(fruit, price[fruit])
# 循环遍历值,获取值
for value in price.values():
print(value)
# 集合
set1 = {'apple', 'banana', 'pear', 'peach', 'apple'}
# 循环遍历元素(无序)
for fruit in set1:
print(fruit)
共同点
-
可以把元组看成不可变的列表。列表中除了元素的增删改外,其他的操作元组几乎都适用。
-
集合与字典都是可变的、无序的。
-
元组和字符串都是不可变的、有序的。
同时遍历两个容器的元素
使用zip函数将两个容器压缩
items1 = zip('ABCDE', '12345')
for a, b in items1:
print(a, b)
运行结果
A 1
B 2
C 3
D 4
E 5
容器型数据类型之间的转换
要把列表转换为字符串,需要用到''.join()
函数,单引号中的字符为连接方式,括号里面放需要转换的类型。
list1 = ['apple', 'banana', 'pear', 'peach', 'apple']
# 列表转为字符串
str2 = ','.join(list1)
print(str2)
运行结果
apple,banana,pear,peach,apple
要把字符串转为列表,可以使用list()
函数
str1 = 'i love eating oranges very much'
# 字符串转为列表
list2 = list(str1)
print(list2)
运行结果
['i', ' ', 'l', 'o', 'v', 'e', ' ', 'e', 'a', 't', 'i', 'n', 'g', ' ', 'o', 'r', 'a', 'n', 'g', 'e', 's', ' ', 'v', 'e', 'r', 'y', ' ', 'm', 'u', 'c', 'h']
列表转元组使用tuple()
函数,元组转列表使用list()
函数
list1 = ['apple', 'banana', 'pear', 'peach', 'apple']
tuple1 = ('apple', 'banana', 'pear', 'peach', 'apple')
# 元组转列表
tuple2 = list(tuple1)
# 列表转元组
list2 = tuple(list1)
print(tuple2)
print(list2)
可以使用集合对列表元素去重
list1 = ['apple', 'banana', 'pear', 'peach', 'apple']
set1 = set(list1)
print(set1)
list2 = list(set1)
print(list2)
运行结果
{'pear', 'peach', 'banana', 'apple'}
['pear', 'peach', 'banana', 'apple']
例题
杨辉三角形
输出一个10行的杨辉三角形:
result = [[] for _ in range(10)]
for i in range(len(result)):
if i == 0:
result[i].append(1)
else:
result[i].append(1)
for j in range(1, i):
result[i].append(result[i - 1][j] + result[i - 1][j - 1])
result[i].append(1)
for index, i in enumerate(result):
for j in i:
print(f'{j:<6}', end='')
print()
运行结果:
生成10组随机验证码
生成10组由4位数字和字母构成的随机验证码
import random
import string
str_ = string.digits + string.ascii_letters
# str_ = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
for _ in range(10):
# 随机抽取4个字符
verify = random.choices(str_, k=4)
print(''.join(verify))
折半查找
有一个从小到大排列的整数列表,找某个元素,找到了返回下标,没找到输出“找不到该数据”。
nums = [12, 21, 35, 48, 55, 62, 79, 87, 95, 100]
low = 0
high = len(nums) - 1
search = int(input('请输入查找的数据:'))
while True:
if low == high - 1:
print('找不到该元素')
break
mid = (low + high) // 2
if search < nums[mid]:
high = mid
elif search > nums[mid]:
low = mid
else:
print(mid)
break
去重
一个列表中有很多重复元素,写一段代码去掉列表中的重复元素。
nums = [10, 10, 2, 21, 10, 21, 50, 48, 37, 9, 0, 10, 21]
unique_nums = []
for i in nums:
if i not in unique_nums:
unique_nums.append(i)
print(unique_nums)
思路:建一个新的空列表,遍历原列表,如果原列表中的元素没有在空列表里,就将其加入到空列表中,这样就实现了去重。
学习了集合之后,也可以用集合给列表去重,但是,元素顺序会有所改变,这时就要看题目有没有要求不改变原列表的元素顺序了。
找出现次数最多的元素
有一个放整数的列表,找出列表中出现次数最多的元素
nums = [10, 10, 2, 21, 10, 21, 50, 48, 37, 9, 0, 10, 21, 10, 21, 50, 48, 21, 37, 56, 50]
# 出现次数最多的元素可能不止一个,可以将出现次数最多的加入到一个列表中
# 假定第一个数出现次数最多
item, max_counter = [nums[0]], nums.count(nums[0])
for num in nums:
# 出现次数比当前列表中的元素出现次数大的,就清空列表,将这个数加入到列表,并更新最大次数的值
if nums.count(num) > max_counter:
item.clear()
item.append(num)
max_counter = nums.count(num)
# 出现次数与当前列表中的元素出现次数相等的,把这个数加入列表
elif nums.count(num) == max_counter:
if num not in item:
item.append(num)
for i in item:
print(i)