『無為則無心』Python序列 — 19、Python列表的其他操作(切片和遍歷)

繁華似錦Fighting發表於2021-07-05

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

相關文章