Python基礎之列表List

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

注:還有很多方法沒有用到不再一一贅述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章