1. 程式人生 > 其它 >python資料結構----列表的基礎語法

python資料結構----列表的基礎語法

列表的查詢

  • index:從左至右查詢元素在列表中所處的位置,如果查詢到該元素返回其第一次出現所在位置的正向下標,如果不存在則報錯

  • count:查詢指定元素在列表中出現的次數

  • in:查詢指定元素是否在列表中

  • not in:查詢指定元素是否不在列表中

# 索引查詢
name_list = ['Bob', 'Jack', 'Rose']

# print(name_list[0]) # Bob
# print(name_list[1]) # Jack
# print(name_list[2]) # Rose
# print(name_list[-1]) # Rose
# print(name_list[-2]) # Jack
# print(name_list[-3]) # Bob

# 結論: 列表中的索引和字串中完全一致,
# 正向索引從0開始,從左至右依次遞增
# 負向索引,從-1開始,從右至左依次遞減

# index 查詢指定元素在列表中的索引,如果查詢成功則返回該元素的正向索引,否則報錯
# index 是從左至右查詢,返回第一次出現的索引位置

num_list = [1, 2, 3, 4, 5, 6, 7, 8, 5]
# 會返回從左至右第一次查詢到的資料索引
print(num_list.index(5)) # 4
# ValueError: 9 is not in list
# 如果沒有查詢到資料則會報錯
# print(num_list.index(9))


# rindex 在列表中沒有這個方法
# AttributeError: 'list' object has no attribute 'rindex'
# print(num_list.rindex(5))

# find 在列表中沒有這個方法
# AttributeError: 'list' object has no attribute 'find'
# print(num_list.find(5))

# count 計數, 查詢指定元素在列表中出現的次數
print(num_list.count(5)) # 2

# in 判斷資料元素是否在列表內 如果在 True 如果不在False
# TypeError: argument of type 'int' is not iterable
# print(num_list in 5)
# 注意使用in或者not in 資料元素在左邊, 列表或者其他資料序列在右側
print(5 in num_list) # True
print(9 in num_list) # False
# not in 判斷資料元素是否不在列表內 如果不在 True 如果在False
print(5 not in num_list) # False
print(9 not in num_list) # True

列表的增加

  • append: 在類表的末尾追加資料

  • extend:將資料序列進行迭代依次提取出每一個元素新增到列表末尾

  • insert:在指定位置追加資料元素

# append 在列表末尾追加資料
num_list = [1, 2, 3, 4]
# 能夠打印出1,2,3,4,5麼?
# print(num_list.append(5)) # None
# 如果直接列印append方法的呼叫,將不會輸出任何內容
# list型別在使用append 方法時不會產生新的列表,而是在原有列表上進行修改
num_list.append(5)
# append 追加的資料,預設追加到列表末尾,追加完成後在原有資料上修改
print(num_list) # [1, 2, 3, 4, 5]

# # str
# str1 = 'abc'
# # str型別資料,呼叫replace方法時,不會修改原有資料,而是產生了一個新的字串
# str2 = str1.replace('abc', 'cba')
# print(str1)
# print(str2)


# extend 追加資料序列
# 格式: 列表1.extend(資料序列)
list1 = [1, 2, 3]
list2 = [4, 5, 6]
# 追加資料序列後,呼叫extend的列表發生變化, 括號內的資料序列不變
# 其實底層邏輯就是講括號內的資料序列迭代,依次放入呼叫該方法的列表中
list1.extend(list2)
print(list1) # [1, 2, 3, 4, 5, 6]
print(list2) # [4, 5, 6]

# 追加字串序列時,會將字母依次拆分並放入列表中
str1 = 'itcast'
list2.extend(str1)
print(list2) # [4, 5, 6, 'i', 't', 'c', 'a', 's', 't']

# 如果括號內填寫的資料,不是資料序列會怎樣?
# TypeError: 'int' object is not iterable 括號內必須是可迭代物件
# list2.extend(4)
# 字串累心哪怕只有一個值,或者只有一個空字串,都是可迭代型別,同理可知,列表,元組等 哪怕只有以資料或者為空型別也是可迭代型別
list2.extend('3')
print(list2)

# insert 插入
num_list = [1, 2, 3, 4]
# 格式:列表.insert(要插入位置的索引, 要插入的物件)
# 在insert中第一個引數是要插入位置的索引,所以如果插入了數,則該被插入資料的索引變為第一引數所顯示的索引
# 原來該位置的元素以及之後的元素下標+1(向後移動一位)
# 如果使用insert進行 插入,可能會造成索引混亂,原來引用的索引發生錯誤
# 在開發中除非明確所有的索引引用都修改完成,否則不要使用insert
# append 插入資料,要比insert插入資料更安全
num_list.insert(1, 5)
print(num_list)

# extend 和append 進行對比
list1 = [1, 2, 3, 4]
list2 = [5, 6, 7, 8]
# append將list2 當做一個元素追加到列表末尾
# list1.append(list2) # [1, 2, 3, 4, [5, 6, 7, 8]]
# extend將list2 當做多個元素進行拆分後追加
list1.extend(list2) # [1, 2, 3, 4, 5, 6, 7, 8]
print(list1)

列表中的刪除

  • del 先對列表中的元素進行查詢(使用下標),找到後使用del刪除

  • pop:刪除類表中指定下標位置的元素,如果不指定預設刪除最後一個,並且返回被刪除的值

  • remove:刪除指定值的下標,只刪除叢左至右的第一次出現的該值元素

  • clear:清空列表,和重新賦值為空有邏輯上的區別。

# del  將資料引用切斷
list1 = [1, 2, 3, 4]
# del list1
# NameError: name 'list1' is not defined
# del不僅可以刪除元素,也可以刪除任何變數,非常強大,但是有些不安全
# print(list1)
# 那del 怎樣刪除元素呢? 通過索引獲取當前元素,並刪除
del list1[2]
# IndexError: list assignment index out of range
# 使用下標查詢資料時,下標索引不能不存在
# del list1[9]
print(list1) # [1, 2, 4]

# 如果要是迴圈中能夠刪除麼?
# 此處並沒有刪除,因為i是臨時變數,我們使用del是在講i和2的引用關係刪除,但是list1 和 2 的引用關係沒有刪除
# for i in list1:
# if i == 2:
# del i
#
# print(list1)

# pop 刪除指定索引的元素,並且返回該元素
list1 = [1, 2, 3, 4]
# 刪除後可以返回被刪除的物件
print(list1.pop(2))
# IndexError: pop index out of range
# 使用pop進行刪除的元素下標一定要存在
# print(list1.pop(12))
# 刪除後,指定索引位置的元素消失後邊的元素統一向左移動一位
# pop也會造成索引變換
print(list1)
# 如果不給pop進行傳值,預設刪除最後一個元素
print(list1.pop())
# 檢視刪除後結果
print(list1)

# remove 刪除指定的元素(從左至右第一次出現的元素)

list1 = [1, 2, 3, 3, 4, 2, 1]
# 刪除列表中的2
# 將從左至右查詢第一次遇到的2進行了刪除,並不能刪除類表中所有的的2
list1.remove(2)
print(list1) # [1, 3, 3, 4, 2, 1]

# remove會返回被刪除的內容? 不會
print(list1.remove(3)) # None
# remove刪除的內容不存在會怎樣?
# list1.remove(123) # ValueError: list.remove(x): x not in list

# clear 清空列表
# 就是講列表置為[],但是與list1 = [] 有本質區別
list1.clear()
print(list1) # []

列表的修改

  • 使用索引修改: 列表[索引] = 新值

    • 查詢列表索引值必須在列表中存在

  • reverse: 列表的反轉

  • sort:列表的排序,預設為升序

    • reverse:可以進行列表倒排,降序

    • key:新增函式,使排序規則更加複雜多變

# 通過索引進行修改
list1 = [1, 2, 3, 4]
# 通過索引查詢到指定位置的資料,並進行修改
list1[1] = 6
# IndexError: list assignment index out of range
# 獲取的元素位置,必須是存在的
# list1[6] = 6
print(list1)

# 通過索引修改可以同時修改多個值麼? 不能
# list1[(2,3)] = 6,7
# 可以使用對多變數賦值的形式修改多個值
list1[2], list1[3] = 6, 7
print(list1)

# reverse 列表的反轉
list1 = [1, 2, 3, 4]
# 列表反轉後,索引倒置,並且在原資料上修改,沒有產生新的列表
print(list1.reverse()) # None
print(list1) # [4, 3, 2, 1]

# sort 排序
list2 = [2, 6, 43, 2, 41, 421]
# sort是對原有的資料進行了排序,沒有產生新的列表.同時,預設排序規則為升序
# print(list2.sort()) # None
# print(list2) # [2, 2, 6, 41, 43, 421]
# 如果我想讓列表降序排列怎麼辦?
# 方法一:可以先排序再反轉
# list2.sort()
# list2.reverse()
# print(list2) # [421, 43, 41, 6, 2, 2]
# 方法二: 可以直接使用倒敘排列
# list2.sort(reverse=True) # [421, 43, 41, 6, 2, 2]
# print(list2)

# list2.sort(key=排序規則函式)可以幫助我們進行更加複雜的排序
# 根據每個元素 % 7 的餘數大小進行排序
# 瞭解, 不要求掌握 後續會講
list2.sort(key=lambda x: x % 7)
print(list2)

列表遍歷

  • for遍歷

  • while遍歷

# while遍歷列表
# len()函式可以查詢列表的長度

list1 = [12, 123, 1, 1, 1234, 12, 34, 8]
# print(len(list1))
i = 0
while i < len(list1):
print(list1[i])
i += 1

# for 遍歷列表
# 推薦使用for迴圈遍歷容器型別(資料序列)
for i in list1:
print(i)

列表的巢狀

  • 列表中巢狀其他的子列表,就是列表的巢狀

  • 巢狀後的列表可以使用迴圈巢狀來進行遍歷

# 列表的巢狀: 在一個列表中包含其他的列表元素

name_list = [['小明', '小紅', '小綠'], ['Tom', 'Lily', 'Rose'], ['張三', '李四', '王五']]

# 需求:想要獲取李四的值
# 獲取李四所在的子列表的索引,並通過索引獲取該子列表值
print(name_list[2])
# 再從子列表中通過李四所在的索引獲取其值
print(name_list[2][1])

# 如果我們想要獲取巢狀列表中的每一個值,我們需要怎麼做?
# 如果進行一次迴圈,每次迴圈所得到的都一級列表中的元素,也就是每一個子列表
for i in name_list:
print(i)

# 如果想要對巢狀後的列表進行輸出,需要進行迴圈巢狀
for sub_list in name_list:
for name in sub_list:
print(name)

# 這樣就可以進行所有名稱的輸出了

# 如果當前的列表內的資料不都是子列表,有其他資料型別的資料,則不能直接使用迴圈巢狀,需要先進行型別判斷