文章目录
第三章.列表
3.1 列表是有序集合[]
列表中可以放任何东西,其中的元素之间可以没有任何关系
给列表指定名字一般用复数,如:letters、digits、names
在Python中用方括号[]来表示列表,并用逗号分隔元素
访问最后一个列表元素可以用下标-1
bicycles = ["cannondale", '666', 23, "specialized", 'trek']
print(bicycles) # 输出 ['cannondale', '666', 23, 'specialized', 'trek']
print(bicycles[4].title()) # 输出 Trek
# 通过索引指定为-1,可以让Python返回最后一个列表元素
# 通过索引指定为-2,可以让Python返回倒数第二个列表元素
# 因此可以在不知道列表长度的情况下访问最后的元素
print(bicycles[-1]) # 输出trek
3.2 列表的增删改查append del pop
列表是动态的,可以快速进行增删改查
append(word)
insert(index,word)
# 在列表末尾添加元素
bicycles.append("wilson")
print(bicycles) # ['cannondale', '666', 23, 'specialized', 'trek', 'wilson']
# 在列表中插入元素
bicycles.insert(1, "here") # 在下标为1的位置插入"here"(变成第二个元素,其余元素后移)
print(bicycles) # ['cannondale', 'here', '666', 23, 'specialized', 'trek', 'wilson']
我们常需要从列表中删除元素,例如,玩家将空中的一个外星人射杀后,你需要将其从存活的外星人列表中删除
使用del删除元素
使用pop()删除元素
方法pop()可以删除列表末尾的元素,并让你能够接着使用它
arrays = ["Lebron", "Durant", "Kobe","Davis"]
del arrays[1] # 删除"Durant"
great = arrays.pop() # 删除"Davis",并把Davis赋给great
print(arrays) # ['Lebron', 'Kobe']
print(great) # Davis
使用pop(index)删除指定元素
players = ["Lebron", "Durant", "Kobe","Davis"]
players.pop(2) # 弹出索引为2的元素
print(players) # ['Lebron', 'Durant', 'Davis']
remove根据值删除元素
players = ["Lebron", "Durant", "Kobe","Davis"]
players.remove("Kobe") # 有时不知道列表中删除的值所处的位置,可用remove方法
sd = ["d"]
sd = players # 列表可以直接赋给另个列表
print(sd) # ['Lebron', 'Durant', 'Davis']
注意:remove只删除第一个指定的值
用while可以删除包含指定值的所有列表元素
pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)
while 'cat' in pets:
pets.remove('cat')
print(pets)
输出
['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']
3.3 排序list.sort()和sorted(list)
sort()和sort(reverse=True) 永久性修改列表
pt = ["faith", "Computer", "79", "share"]
pt.sort() # 按字符从小到大排序
print(pt) # ['79', 'Computer', 'faith', 'share']
pt.sort(reverse=True) # 按字符从大到小排序
print(pt) # ['share', 'faith', 'Computer', '79']
sorted(list) 暂时性修改列表
cars = ['bmw', 'audi', 'toyota', 'subaru']
print(sorted(cars)) # ['audi', 'bmw', 'subaru', 'toyota']
print(cars) # ['bmw', 'audi', 'toyota', 'subaru']
list.reverse() 反转列表
len(list) 确定列表的长度
用途:确定还有多少个外星人未被射杀,需要管理多少项可视化数据,网站有多少注册用户
注意:发生索引错误(下标越界)却找不到解决方法时,可以尝试将列表或其长度打印出来
3.4 列表非空时执行
requested_toppings = ['mushrooms', 'green peppers', 'extra cheese']
if requested_toppings: # 列表非空时执行
...
第四章.操作列表
4.1 for循环
for循环要加冒号和注意缩进
使用单数和复数式名称,可以帮助判断代码段处理的是单个列表元素还是整个列表
for car in cats:
for item in list_of_items:
magicians = ['alice', 'david', 'carolina']
for magician in magicians: # 每个缩进的代码行都是for循环的一部分
print(magician.title() + 'Alice, that was great trick!')
print("I can't wait to see your next trick, " + magician.title() + ".\n")
4.2 避免缩进错误
Python根据缩进来判断代码行与前一个代码行的关系
对于for语句后面且属于循环组成部分的代码行,一定要缩进
如果你预期某项操作将针对每个列表元素都执行一次,但它却只执行了一次,请确定是否需要将一行或多行代码缩进
下面示例中print无效缩进,因为它不属于前一行代码
message = "Hello Python World"
print(message) # unexpected indent
为避免意外缩进错误,请只缩进需要缩进的代码
4.3 数字列表range(start, end, gap)
range()返回一个可迭代对象,不是一个列表,所以要用list(range(1,10))
转换
使用range()函数
range(start,end) # 左闭右开
range(end) = range(0,end) # 默认从0开始
range(start,end, gap)
for value in range(2, 7):
print(value) # 输出2-6
for va in range(3):
print(va) # 输出0-2
# 可以使用list()将range()的结果直接转换为列表
even_numbers = list(range(2, 11, 2))
print(even_numbers) # 输出[2, 4, 6, 8, 10]
创建一个列表,1-10的平方
squares = []
for value in range(1, 11):
square = value ** 2
squares.append(square)
print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
对列表进行简单的统计计算
min(list)
max(list)
sum(list)
digits = [1, 2, 3, 4, 5]
print(max(digits)) # 5
print(min(digits)) # 1
print(sum(digits)) # 15
4.3.1列表解析 [value ** 3 for value in range(1, 11)]
列表解析是将for循环和创建新元素的代码合并成一行
# 普通写法
squares = []
for value in range(1,11):
squares.append(value ** 2)
print(squares)
# 列表解析写法
squares = [value ** 2 for value in range(1,11)]
print(squares)
# 列表解析
Ones = [val for val in range(5)]
print(Ones) # [0, 1, 2, 3, 4]
Threes = [value ** 3 for value in range(1, 11)]
print(Threes) # [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
dist = np.array([4,5,2,1,3])
labels = ['A','A','B','B','A']
print(dist.argsort()) # [3 2 4 0 1]
# 列表解析
k_labels = [labels[index] for index in dist.argsort()[0 : 3]]
print(k_labels) # ['B', 'B', 'A']
4.4 切片list[start: end: gap] 列表/字符串
players[start:end:gap]
左闭右开
players = ['Lebron', 'Irving', 'Love', 'JR', 'Thompson']
print(players[1:5]) # 输出下标1-2的元素
print(players[1:5:3]) # 输出下标1, 4的元素
print(players[:4]) # 输出下标0-3的元素
print(players[1:]) # 没有结束索引时,自动终止于列表末尾
# ['Irving', 'Love', 'JR', 'Thompson']
# ['Irving', 'Thompson']
# ['Lebron', 'Irving', 'Love', 'JR']
# ['Irving', 'Love', 'JR', 'Thompson']
输出最后三个元素
players = ['Lebron', 'Irving', 'Love', 'JR', 'Thompson']
print(players[-3:]) # 输出最后三个元素
遍历切片
players = ['Lebron', 'Irving', 'Love', 'JR', 'Thompson']
for player in players[1:4]: # 遍历下标为1-3的元素
print(player)
用途:排序后,获取某个玩家的三个最高得分;编写Web应用程序时,可使用切片来分页显示信息,并在每页显示数量合适的信息
字符串也有切片
filename = 'text_files/pi_million_digits.txt'
with open(filename) as file_object:
pi_million = ""
for line in file_object:
pi_million += line.strip() # 删除两端空格或\n
print(pi_million[0:12]) # 输出字符串前12个字符
4.4.1 直接用列表赋值(指向)
相当于C++引用,把stars指向了players
players = ['Lebron', 'Irving', 'Love', 'JR', 'Thompson']
stars = players
players.append('Durant')
stars.append('Curry')
print(players)
print(stars) # 输出结果相同
4.4.2 用切片[:]赋值列表
切片表示法[:]创建列表副本
得到的两个不同的列表,相当于生成一个副本
players = ['Lebron', 'Irving', 'Love', 'JR', 'Thompson']
stars = players[:]
players.append('Durant')
stars.append('Curry')
print(players) # ['Lebron', 'Irving', 'Love', 'JR', 'Thompson', 'Durant']
print(stars) # ['Lebron', 'Irving', 'Love', 'JR', 'Thompson', 'Curry']
4.4.3 双冒号用法[::-1]
s = [1,2,3,4,5]
# 根据第三个位置的正负,从第一个或从最后一个开始遍历
print(s[::-1])
# [5, 4, 3, 2, 1]
print(s[::2])
# [1, 3, 5]
4.5 元组()
有时需要创建一系列不可修改的元素,元组(tuple)就可以满足这种需求
元组类似列表,但是使用圆括号
而不是方括号来标识
不能修改元组中的元素,但能修改元组变量
# 元组
dimensions = (10, 15, 13)
print(dimensions) # 输出 (10, 15, 13)
# dimensions[0] = 20 # 错误,不能修改元组中的元素
dimensions = (11, '2') # 修改元组变量是可以的
print(dimensions) # 输出 (11, '2')
下面的例子,表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,tuple所谓的“不变”是说,tuple的每个元素,指向永远不变
tuple = (1, 2, [3, 4])
tuple[2][0] = 5
print(tuple) # (1, 2, [5, 4])
写在最后:我的博客主要是对计算机领域所学知识的总结、回顾和思考,把每篇博客写得通俗易懂是我的目标,分享技术和知识是一种快乐 ,非常欢迎大家和我一起交流学习,有任何问题都可以在评论区留言,也期待与您的深入交流(^∀^●)