这周学习了列表、元组、字符串、集合、字典,五种容器类型,下面对五种容器类型做一个简单的总结,使人更好的去认识他们。
列表(list)----------->[元素,元素,元素 ]
元组(tuple)-------->(元素,元素,元素)
字符串(str)----------> ‘字符数据’
集合(set)---------->{元素,元素,元素,元素}
字典(dict)---------->{键:值,键:值}
举例:
# 列表
list1 = [] # 表示空列表
list2 = [1, 2, 3, 4] # 定义列表用[],里面的元素可以是任何类型的数据
# 元组
tuple1 = ('apple', 'banana', 'grape') # 定义元组用()
tuple2 = (100,) # 一元组要加逗号
tuple3 = () # 空元组
print(tuple3, type(tuple3))
# 字符串
str1 = 'hello, world' # 定义字符串,需要用 ' ', " ",或者是 """ """ 将单个字符或多个字符括起来
# 集合
set1 = {1, 2, 3, 4} # 定义集合用{}
set2 = set() # 创建空集合
# 字典
student1 = { # 由键和值组成,键和值用 :隔开
'id': 1010,
'name': '小明',
'sex': 'True',
'birthday': '2000-1-1'
}
1:列表
、字典
是可变的,支持增,删,查,改的操作
其中列表
支持下标运算.字典
通过键找到与之对应的值并进行操作。
集合
中的元素是可变的,只支持增,删,查,并且它是无序的不能通过下标来查找元素
2:元组
、字符串
中的元素是不可变的,只支持查的操作。其中元组
、字符串
可以通过切片索引的方式查找元素。
列表 | 字符串 | 元组 | 集合 | 字典 |
---|---|---|---|---|
可变 | 不可变 | 不可变 | 可变,但是不能修改元素 | 字典是可变的,字典中的键必须是不可变 |
有序 | 有序 | 有序 | 无序,其中所有的元素都是不重复的 | 无序,通过键,或者值来进行查找 |
经常使用于列表
中,字典
中也会用到。其中列表
可用sort
、sorted
,而字典
只支持sorted
list1 = ['1', '2', '3', '4']
list1.sort(key=int, reverse=True) # reverse=True由高到低排序,指定排序按照int类型来排
print(list1)
stocks = {
'AAPL': 191.88,
'GOOG': 1186.96,
'IBM': 149.24,
'ORCL': 48.44,
'ACN': 166.89,
'FB': 208.09,
'SYMC': 21.29
}
x = sorted(stocks, key=stocks.get, reverse=True) # 通过字典的键的值来从大到小排序,最后输出的是字典的键
print(x)
如果不指定key
,字典
默认对字典
的键进行排序.不指定reverse
,默认排序为从小到大。
random.sample()
对列表进行无放回抽样
random.choices()
对列表进行有放回抽样
choice
函数可以从列表中选择一个元素
shuffle
函数打乱顺序
max()
求最大值
min()
求最小值
count()
统计出现的次数
例子
用一个列表保存52张扑克牌,洗牌,按斗地主的发牌方式把牌发给三个玩家,多的3张牌给第一个玩家(地主),把每个玩家手上的牌显示出来
import random
kinds1 = ['♠', '♣', '♥', '♦']
kinds2 = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
cards = [f'{i}{j}' for i in kinds1 for j in kinds2] # 将数字与花色组合起来
cards.append('大王')
cards.append('小王')
print(cards)
print(len(cards))
random.shuffle(cards) # 随机打乱牌的顺序
# 嵌套列表(列表中的元素又是列表)
players =[[] for _ in range(3)] # 创建三个空列表代表三个玩家
for _ in range(17):
for player in players:
player.append(cards.pop()) # 将牌取出来
players[0] += cards # 将剩下三张牌给第一个玩家
# players[0].extend(cards) # 将一个列表的元素合并到另一个列表
for player in players:
# 对列表的元素进行排序
player.sort(key=lambda x: x[1])
for card in player:
print(card, end=' ')
print()
例子2:
保存5个学生,3门课的成绩
import random
names = ['小黑', '小辉', '小红', '小米', '小明']
courses = ['语文', '数学', '英语']
scores = [[random.randrange(50, 101) for _ in range(len(courses))] for _ in range(5)]
print(scores)
# 求每个同学的平均成绩
for i, name in enumerate(names):
print(f'{name}同学的平均成绩:{sum(scores[i]) / len(courses):.1f}')
#求每个课程的最高分,最低分
for j, course in enumerate(courses):
temp = [scores[i][j] for i in range(len(name))]
print(f'{course}的最高分:{max(temp)}')
print(f'{course}的最低分:{min(temp)}')
例子3:
输出10行的杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
x = int(input('输入一个数:'))
nums =[[] for _ in range(x)]
for i in range(x):
nums[i].append(1)
if i > 0:
for j in range(1, i):
nums[i].append(nums[i - 1][j - 1] + nums[i - 1][j])
nums[i].append(1)
for num in nums[i]:
print(num, end='\t')
print()
结果·:
输入一个数:10
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
方法2:
x = int(input('输入一个数:'))
nums = [[0] * x for _ in range(x)]
for i in range(x):
nums[i][0] = 1
nums[i][i] = 1
for j in range(1, i):
nums[i][j] = nums[i - 1][j - 1] + nums[i - 1][j]
# for i in range(x):
# for j in range(i + 1):
# print(nums[i][j], end='\t')
# print(' ')
for i in range(x):
for j in range(x - i):
print(end=' ')
for k in range(i + 1):
print(nums[i][k], end=' ')
print(' ')
结果:
输入一个数:10
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
例题3:
一个列表中有很多重复元素,写一段代码去掉列表中的重复元素
方法一:
list1 = [1, 2, 3, 2, 3, 4]
list2 = []
for x in list1:
if x not in list2:
list2.append(x)
print(list2)
方法二:
将列表转换成集合去重,再变成列表
set1 = set(list1)
list2 = list(set1)
print(list2)
例题四:
有一个放整数的列表,找出列表中出现次数最多的元素
# 方法一
d = list1.count(list1[0])
for i in list1:
if list1.count(i) > d:
d = list1.count(i)
for x in list1:
if list1.count(x) == d:
print(x)
list1.remove(x)
方法二
items, max_count = [list1[0]], list1.count(list1[0])
for num in list1[1:]:
if list1.count(num) > max_count:
items.clear()
items.append(num)
max_count = list1.count(num)
elif list1.count(num) == max_count:
if num not in items:
items.append(num)
for x in items:
print(x)
例题5:
生成10组随机验证码(由数字和英文字母构成,长度为4)
import random
import string
list1 = string.ascii_letters + string.digits
# list = '0123456789abcdefghijklmnopqrstuvwsyzABCDEFGHJIKLMNOPQRSTVUWSYZ'
for _ in range(10):
x = random.choices(list1, k=4)
print(''.join(x))
例题六:
有一个放整数的列表,其中有一个整数出现次数超过了半数以上,请找出该元素(考虑效率,不使用嵌套循环)
list1 = [1, 3, 3, 3, 2, 2, 3]
counter, temp = 0, None
for num in list1:
if counter == 0:
temp = num
counter = 1
else:
if num == temp:
counter += 1
else:
counter -= 1
print(temp)
"""
过程:
num 1 3 3 3 2 2 3
temp 1 1 3 3 3 3 3
counter 1 0 1 2 1 0 1
"""
例题7:
输入一段话,统计每个单词出现的次数
str1 = 'Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.'
str2 = str1.lower()
str2 = str2.replace(',', '').replace('.', '')
str2 = str2.split(' ')
dict2 = {x: 0 for x in str2}
for word in str2:
dict2[word] += 1
for key, value in dict2.items():
print(f'{key}出现了{value}次')