Python基礎之列表List
數據結構是指相互之間存在一種或多種特定關係的數據元素的集合。
在Python中擁有四大數據結構:列表list
、集合dict
、元組tuple
、集合set
本篇主要介紹最常用數據結構List
1.列表定義
列表:本質上是一個大容器,在該容器中存在若干個子容器,每一個容器都可以存儲任意類型的數據,列表中元素的訪問可以通過list[index]的方式訪問,其中index代表子容器的下標,該下標從0開始
names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
# 獲取列表數據
print(names[0])
# wxq
2.列表創建
方式1:通過[]快速創建
list1 = [1, 2, 3, 'aa', 'bb']
print(list1)
# [1, 2, 3, 'aa', 'bb']
方式2:通過list()方法創建,開發中經常用來類型轉換
list1 = list(range(10))
print(list1)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
方式3:通過表達式創建,語法結構:[數學表達式 條件1 條件2 條件3…]
數學表達式用來產生一個數據
條件1:for循環,用來執行數據的重複生成
其他條件:可以是for循環也可以是if判斷
# 取出1-9的偶數並放入列表
list1 = [x for x in range(1, 9) if x & 1 == 0]
print(list1)
# [2, 4, 6, 8]
# 定義一個列表,存儲所有的水仙花數
list1 = [i for i in range(100, 1000) if (i // 100) ** 3 + (i % 100 // 10) ** 3 + (i % 10) ** 3 == i]
print(list1)
# [153, 370, 371, 407]
方式4:生成器
語法定義: list1 = (生成規則)
此時list1是一個生成器對象,該生成器可以根據開發者的需要靈活決定數據生成的數量,有效地提高計算機的使用效率
如果需要生成一個數據,此時可以通過next(list1),保證生成器list1推斷出該數據。並且注意,每一次使用next調用生成器推斷數據時,生成器都會在前一次推斷的基礎上推斷下一個數據,如果推斷過程超出生成器負載範圍,此時生成器會以異常信息StopIteration方式告知開發者該推斷過程已經結束
另外生成器本質上也是可以進行迭代的迭代器,可以通過for-in遍歷該迭代器,取出所有的推斷數據
# 有四個數字:1、2、3、4,能組成多少個互不相同且無重複數字的三位數?各是多少?
list1 = (100*x+10*y+z for x in range(1, 5) for y in range(1, 5) if x != y for z in range(1, 5) if z != x and z != y)
for item in list1:
print(item, end=" ")
# while True:
# print(next(list1), end=" ")
# 使用while會異常停止,可以根據異常拋出來終止生成器
# 123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432
3.列表的數據提取
方式1:list[index]
獲取單個指定下標列表數據
方式2:list[:]
獲取整個列表數據
方式3:list[a:]
獲取原列表中下標從a開始到列表結束的所有數據
方式4:list[:a]
獲取原列表中下標從0開始到a-1位置所有數據
方式5:list[a:b]
獲取原列表中下標從a開始到b-1位置的所有數據
方式6:list[a:b:2]
獲取原列表中下標從a開始到b-1位置的數據,每次移動兩個位置
列表切片:通過指定切片的範圍從原列表中提取一段數據的操作
注意:在切片過程中切片得到一個新列表並返回給外界,原列表不會受到影響
list1 = [x for x in range(11)]
print(list1) # 輸出整個列表
print(list1[0]) # 輸出第0個數據
print(list1[:]) # 輸出整個列表
print(list1[:3]) # 輸出第0個到第(3-1)個
print(list1[3:]) # 輸出第3個到最後一個
print(list1[1:3]) # 輸出第1個到第(3-1)個
print(list1[1:7:2]) # 輸出第1個到第6個,每次移動兩個位置
print(list1[-5:-2]) # 負數代表從後向前數,但實際情況中列表動態生成,此方法不常用
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 0
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# [0, 1, 2]
# [3, 4, 5, 6, 7, 8, 9, 10]
# [1, 2]
# [1, 3, 5]
# [6, 7, 8]
4.列表的數據增加
(1)向末尾添加數據
list.append(item)
:將數據item添加到列表item中。注意,本次添加在列表最後進行
names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
names.append('狗剩子')
print(names)
# ['wxq', 'ysp', 'ysb', 'zzb', 'sxl', '狗剩子']
(2)在任意位置插入數據
list.insert(index,obj)
:在指定的下標index處將元素obj添加到列表中,該方法可以靈活決定元素添加的位置
names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
names.insert(3, '小菜菜')
print(names)
# ['wxq', 'ysp', 'ysb', '小菜菜', 'zzb', 'sxl']
(3)列表合併
使用+
連接需要合併的兩個列表,返回新的列表
list1 = [1, 2, 3]
list2 = ['aa', 'nn']
list3 = list1 + list2
print(list3)
# [1, 2, 3, 'aa', 'nn']
(4)列表複製
List*n
:將list中每一個元素重複n遍
list1 = [1, 2, 3]
list1 = list1 * 3
print(list1)
# [1, 2, 3, 1, 2, 3, 1, 2, 3]
5.列表的數據刪除
方式1:list.pop()
:移除列表元素,並且把該元素返回給外界使用,但是注意,如果pop沒有給定下標,此時默認移除列表中最後一個位置元素。如果給定下標,此時移除指定下標位置的元素
list1 = [1, 2, 3, 4, 5]
print(list1) # 初始
print(list1.pop()) # 無下標
print(list1.pop(0)) # 有下標
print(list1) # 刪除後
# [1, 2, 3, 4, 5]
# 5
# 1
# [2, 3, 4]
方式2:remove(obj)
:移除列表中第一個與obj匹配的元素,只移除第一個
list1 = [1, 1, 3, 4, 5]
print(list1)
list1.remove(1)
print(list1)
# [1, 1, 3, 4, 5]
# [1, 3, 4, 5]
方式3:清空列表。使用list.clear()
或將list指向空列表如list = []
# list.clear()
list1 = [1, 2, 3, 4, 5]
print(list1)
list1.clear()
print(list1)
# [1, 2, 3, 4, 5]
# []
# list = []
list1 = [1, 2, 3, 4, 5]
print(list1)
list1 = []
print(list1)
# [1, 2, 3, 4, 5]
# []
方式4:刪除列表。與清空列表不同,def 列表名
刪除列表將把整個列表從內存中刪除,再次訪問列表會出現異常
list1 = [1, 2, 3, 4, 5]
del list1
print(list1)
# NameError: name 'list1' is not defined
6.列表數據的修改
直接使用list[index] = 需要修改的值
修改數據
names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
names[0] = "狗蛋"
print(names)
# ['狗蛋', 'ysp', 'ysb', 'zzb', 'sxl']
7.列表數據的遍歷
方式一:通過下標遍歷(可寫)
names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
num = len(names) # 獲取列表長度
print(names)
for i in range(num):
names[i] = i
print(names)
# ['wxq', 'ysp', 'ysb', 'zzb', 'sxl']
# [0, 1, 2, 3, 4]
方式二:通過迭代直接獲取(只讀)
names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
for item in names:
print(item, end=" ")
# xq ysp ysb zzb sxl
方式三:使用內置函數map()遍歷(自動遍歷計算)
map(fun,list)
:map用來完成對列表list的便利操作,每一次遍歷都會自動調用fun函數完成對遍歷得到的元素的計算,當遍歷結束之後會返回一個map對象
# 遍歷列表並將每一項進行平方運算
list1 = [x for x in range(10)]
result = map(lambda x: x**2, list1)
print(list(result))
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
方式四:使用內置函數filter()遍歷(提取指定數據)
filter(fun,list)
:用來遍歷列表list,按照給定的過濾條件,完成對滿足條件的數據的過濾操作。
其中fun
對應的是回調函數,充當過濾條件,因此fun的返回結果必須是一個True/False的布爾類型結果,如果結果爲True此時保留該元素,如果爲False則刪除對應的元素
# 提取列表中的字符串
list1 = [1, 2, 3, 4, 5, "xiaocaicai", "xiaodaidai"]
result = filter(lambda x: isinstance(x, str), list1)
print(list(result))
# ['xiaocaicai', 'xiaodaidai']
8.列表的其他操作
(1)獲取列表長度
長度 = len(list)
names = ["wxq", "ysp", "ysb", "zzb", "sxl"]
num = len(names)
print(num)
# 5
(2)列表排序
list.sort()
對指定列表進行排序,默認排序方式爲升序排序(從小到大)
reverse:布爾類型,默認爲false,如果設置爲True,則排序按照降序進行排序
list1 = [2, 2, 1, 5, 3, 10]
list1.sort()
print(list1)
list1.sort(reverse=True)
print(list1)
# [1, 2, 2, 3, 5, 10]
# [10, 5, 3, 2, 2, 1]
注意:list.sort()會在原列表上排序,謹慎使用
(3)列表翻轉
list.reverse()
直接將列表list中所有內容翻轉
list1 = [1, 2, 3]
list1.reverse()
print(list1)
# [3, 2, 1]
(4)統計個數
list.count(obj)
:統計obj數據在列表中出現的次數
list1 = [1, 2, 1, 1, 1, 1, 1, 1]
print(list1.count(1))
# 7
(5)獲取元素位置
list.index(obj)
獲取指定元素在列表中第一次出現的位置
list1 = [1, 2, 1, 1, 1, 1, 1, 1]
print(list1.index(1))
# 0
(6)判斷是否在列表中
判斷某元素是否在列表中(in, not in)
list1 = [1, 2, 1, 1, 1, 1, 1, 1]
print(1 in list1)
print(1 not in list1)
# True
# False
注:還有很多方法沒有用到不再一一贅述