上一篇文章介紹了列表操作的常用API,本篇文章再說明一些列表(
List
)其他一些很常用的操作。
1、通過切片對列表的操作
注意:在給切片進行賦值時,只能使用序列賦值。
(1)通過切片對列表進行修改
"""
1、使用一個序列替換,一個列表的片段。
注意:不過替換序列的當度是多少,
都完全替換列表中的指定位置,前閉后開。
輸出結果:
修改前: ['孫悟空', '豬八戒', '沙和尚', '唐僧']
修改后: ['牛魔王', '紅孩兒', '沙和尚', '唐僧']
"""
stus = ['孫悟空','豬八戒','沙和尚','唐僧']
print("修改前:", stus)
stus[0:2] = ['牛魔王','紅孩兒']
# stus[0:2] = ['牛魔王','紅孩兒','二郎神','白骨精']
# stus[0:2] = ['牛魔王']
print("修改后:", stus)
"""
2、向列表中指定位置插入一個序列
輸出結果:
修改前: ['孫悟空', '豬八戒', '沙和尚', '唐僧']
修改后: ['牛魔王', '孫悟空', '豬八戒', '沙和尚', '唐僧']
"""
# 向索引為0的位置插入元素
stus = ['孫悟空','豬八戒','沙和尚','唐僧']
print("修改前:", stus)
stus[0:0] = ['牛魔王']
# stus[2:2] = ['牛魔王']
print("修改后:", stus)
"""
3、當設置了步長時,
序列中元素的個數必須和切片中元素的個數一致。
輸出結果:
修改前: ['孫悟空', '豬八戒', '沙和尚', '唐僧', '蜘蛛精', '白骨精']
修改后: ['牛魔王', '豬八戒', '紅孩兒', '唐僧', '二郎神', '白骨精']
"""
stus = ['孫悟空','豬八戒','沙和尚','唐僧','蜘蛛精','白骨精']
print("修改前:", stus)
stus[::2] = ['牛魔王','紅孩兒','二郎神']
# stus[::2] = ['牛魔王','紅孩兒'] # 報錯
# stus[2::2] = ['牛魔王','紅孩兒'] # 正常
print("修改后:", stus)
"""
當stus[::2],表示全列表,每兩步選一個元素,
列表一個有6個元素,
所以該切片一個有三個元素。
所以后邊賦值三個元素的序列就能夠成功。
當stus[::2],同理切片中元素是3,
你賦值兩個元素的序列,不相等,就報錯。
當stus[2::2], 切片中元素是2,
你賦值兩個元素的序列,相等,則正常修改。
"""
(2)通過切片對列表進行刪除
"""
# 在列表中刪除切片中的元素
輸出結果:
修改前: ['孫悟空', '豬八戒', '沙和尚', '唐僧']
修改后: ['沙和尚', '唐僧']
修改后: ['唐僧']
修改后: ['唐僧']
"""
stus = ['孫悟空','豬八戒','沙和尚','唐僧']
print("修改前:", stus)
del stus[0:2]
print("修改后:", stus)
del stus[::2]
print("修改后:", stus)
stus[1:3] = []
(3)注意
以上操作,只適用於可變序列。
包括列表中學習的方法,只能支持可變序列。
2、列表的循環遍歷
什么是遍歷,就是安順序依次訪問到序列當中的每一個數據。換句話說遍歷指的就是將列表中的所有元素一個一個的取出來。
需求:依次打印列表中的各個數據。
(1)while循環遍歷
"""
輸出結果:
Tom
Lily
Rose
"""
name_list = ['Tom', 'Lily', 'Rose']
i = 0
while i < len(name_list):
print(name_list[i])
i += 1
"""
如果遍歷的下標越界,則會拋出異常,
IndexError: list index out of range
"""
name_list = ['Tom', 'Lily', 'Rose']
i = 0
while i < len(name_list)+2:
print(name_list[i])
i += 1
(2)for循環遍歷
只要是序列,就都可以使用for循環遍歷。
"""
輸出結果:
Tom
Lily
Rose
"""
name_list = ['Tom', 'Lily', 'Rose']
for i in name_list:
print(i)
3、列表嵌套
所謂列表嵌套指的就是一個列表里面包含了其他的子列表。
應用場景:要存儲班級一、二、三3個班級學生姓名,且每個班級的學生姓名在一個列表。
name_list = [['小明', '小紅', '小綠'], ['Tom', 'Lily', 'Rose'], ['張三', '李四', '王五']]
思考: 如何查找到數據"李四"?
# 第一步:按下標查找到李四所在的班級列表
# 結果:['張三', '李四', '王五']
print(name_list[2])
# 第二步:從李四所在的班級列表里面,再按下標找到數據李四
# 結果:李四
print(name_list[2][1])
4、綜合示例
需求:有三個辦公室,8位老師,8位老師隨機分配到3個辦公室
"""
步驟:
1. 准備數據
1.1 8位老師 -- 列表
1.2 3個辦公室 - 列表嵌套
2. 分配老師到辦公室
隨機分配,調用random函數
就是把老師的名字寫入到辦公室列表中,
換句話說就是向辦公室列表追加老師名字。
3. 驗證是否分配成功
打印辦公室詳細信息:每個辦公室的人數和對應的老師名字。
"""
import random
# 1. 准備數據,老師和辦公室
teachers = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
offices = [[], [], []]
# 2. 分配老師到辦公室
# 遍歷老師列表數據,取到的每個老師隨機放到一個辦公室列表。
for name in teachers:
# 列表追加數據 -- append(選擇) extend insert
# num隨機辦公室號
num = random.randint(0, 2)
offices[num].append(name)
# 以上代碼,老師已經分配完辦公室,下面只是輸出格式。
# 為了更貼合生活,把各個辦公室子列表加一個辦公室編號 1, 2, 3
i = 1 # 辦公室編號
# 3. 驗證是否分配成功
for office in offices:
# 打印辦公室人數
# 子列表數據的個數用len()獲取
print(f'辦公室{i}的人數是{len(office)},老師分別是:')
# 打印每個辦公室內老師的名字
for name in office:
print(name)
i += 1