上一篇文章介紹了列表操作的常用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