1:列表的定義及特性
列表是一種有序集合數據類型,列表可以包含任何類型的對象(數字,字符串,列表,字典等等),列表是可變對象類型,支持在原位置修改操作。列表具有如下特性:
a:任意對象的有序集合,它可變長度,能夠任意嵌套。
b:可通過偏移訪問。
C:屬於“可變系列”的分類。
D:列表是對象引用數組
lst = ['中', '華', '人', '民', '共', '和', '國'] 的賦值過程如下圖:
2:常用列表字面量及操作
2.1常用列表字面量及操作彙總
操作 |
說明 |
L=[] |
一個空列表 |
L=[123,’456’,3.14,’ixusy88’] |
列表:4個對象 |
L=[123,’456’,[3.14,’ixusy88’]] |
嵌套的字列表 |
L=list(‘ixusy88’) |
可迭代對象的列表 |
L=list(range(3,10)) |
連續整數的列表 |
L[i] |
索引 |
L[i][j] |
索引的索引 |
L[i:j] |
分片 |
len(L) |
長度 |
L1+L2 |
拼接 |
L*3 |
重複 |
for x in L:print(x) |
迭代 |
8 in L |
成員關係 |
L.append(8) |
尾部添加 |
L.extend([5,6,7]) |
尾部擴展 |
L.insert(i,x) |
插入 |
L.index(X) |
索引 |
L.count(X) |
統計元素出現的次數 |
L.sort() |
排序 |
L.reverse() |
反轉 |
L.copy() |
複製 |
L.clear() |
清除 |
L.pop(i) |
刪除i處元素,並將其返回 |
L.remove(X) |
刪除元素x |
del L[i] |
刪除i處元素 |
del [i:j] |
刪除i到j處的元素 |
L[i:j] = [] |
刪除i到j處的元素 |
L[i] = 8 |
索引賦值 |
L[i:j] = [1,2,3] |
分片賦值 |
L= [x**2 for x in range(5)] |
列表推導 |
2.2列表的索引與切片
2.2.1列表的索引
列表是有序序列,與字符串一樣,也支持索引下標訪問,並且支持通過下標修改;
索引訪問:
索引爲正數:
lst = ['中', '華', '人', '民', '共', '和', '國']
print('lst=',lst,'\nlen(lst)=',len(lst))
print('lst[0]=',lst[0])
print('lst[1]=',lst[1])
print('lst[2]=',lst[2])
print('lst[3]=',lst[3])
print('lst[4]=',lst[4])
print('lst[5]=',lst[5])
print('lst[6]=',lst[6])
print('lst[7]=',lst[7])
結果:
lst= ['中', '華', '人', '民', '共', '和', '國']
len(lst)=Traceback (most recent call last):
7
lst[0]= 中
lst[1]= 華
lst[2]= 人
lst[3]= 民
lst[4]= 共
lst[5]= 和
lst[6]= 國
File "D:\python\列表.py", line 14, in <module>
print('lst[7]=',lst[7])
IndexError: list index out of range
也支持索引爲負數:
lst = ['中', '華', '人', '民', '共', '和', '國']
print('lst=',lst,'\nlen(lst)=',len(lst))
print('lst[-1]=',lst[-1])
print('lst[-2]=',lst[-2])
print('lst[-3]=',lst[-3])
print('lst[-4]=',lst[-4])
print('lst[-5]=',lst[-5])
print('lst[-6]=',lst[-6])
print('lst[-7]=',lst[-7])
結果爲:
lst= ['中', '華', '人', '民', '共', '和', '國']
len(lst)= 7
lst[-1]= 國
lst[-2]= 和
lst[-3]= 共
lst[-4]= 民
lst[-5]= 人
lst[-6]= 華
lst[-7]= 中
2.2.2列表的切片:
與字符串一樣,列表也支持切片操作:語法一樣。
語法: str[start: end:step] start默認爲0,end默認爲字符長度,step默認爲1
start: 起始位置
end: 結束位置
step:步長
規則: 顧頭不顧尾, 從start開始截取. 截取到end位置. 但不包括end
step爲步長: 如果是正數, 則從左往右取. 如果是負數. 則從右往左取. 默認是1;
先上圖:
代碼:
print('*' * 30)
lst = ['中', '華', '人', '民', '共', '和', '國']
print('lst=',lst,'\nlen(lst)=',len(lst))
# 不帶參數
print('lst[::2]=',lst[::2])
#截取 下標0開始,右邊的所有元素,相當於複製了整個列表
# 默認 0開始
print('lst[:]=',lst[:])
#截取 下標-1開始,左邊的所有元素,相當於複製了反轉之後的列表
#默認 -1開始
print('lst[::-1]=',lst[::-1])
# 截取 下標爲2開始右邊的所有元素,結束位置默認爲列表的長度
print('lst[2:]=',lst[2:])
# 截取 下標爲2開始左邊的所有元素,
print('lst[2::-1]=',lst[2::-1])
# 截取 下標爲2開始右邊的,直到下標5結束的所有元素(不包下標5的元素)
print('lst[2:5]=',lst[2:5])
# 截取 下標爲2開始左邊的,直到下標5結束的所有元素;結果爲[],因爲下標2左邊的下標均小於2,故不可能到達下標5
print('lst[2:5:-1]=',lst[2:5:-1])
# 截取 下標0開始,右邊,直到下標爲5結束的所有元素(不包下標5的元素);
print('lst[:5]=',lst[:5])
# 截取 下標-1開始,左邊,直到下標爲5結束的所有元素(不包下標5的元素);開始位置默認爲-1
print('lst[:5:-1]=',lst[:5:-1])
print('*' * 30)
結果:
******************************
lst= ['中', '華', '人', '民', '共', '和', '國']
len(lst)= 7
lst[::2]= ['中', '人', '共', '國']
lst[:]= ['中', '華', '人', '民', '共', '和', '國']
lst[::-1]= ['國', '和', '共', '民', '人', '華', '中']
lst[2:]= ['人', '民', '共', '和', '國']
lst[2::-1]= ['人', '華', '中']
lst[2:5]= ['人', '民', '共']
lst[2:5:-1]= []
lst[:5]= ['中', '華', '人', '民', '共']
lst[:5:-1]= ['國']
******************************
2.3列表的增刪改查
列表是可變數據類型,因此可以進行增刪改操作:
2.3.1:列表的增加操作:
# 新增
# 1:append,每次都在末尾添加元素
lst = []
lst.append('林志穎')
lst.append('張學友')
lst.append('劉德華')
lst.append('張柏芝')
print('1:',lst) # 輸出 ['林志穎', '張學友', '劉德華', '張柏芝']
# 2:insert
lst = ['林志穎', '張學友', '劉德華', '張柏芝']
lst.insert(2, '周杰倫') # 在2號位置插入,即在'劉德華'位置插入,'劉德華'及後面的數據向後移動;插入的時候,可能會導致元素移動
print('2:',lst) # ['林志穎', '張學友', '周杰倫', '劉德華', '張柏芝']
# 3:迭代添加:extend
lst = ['劉德華', '張柏芝']
lst.extend('林志穎') # 字符串爲可迭代對象,會把字符串中的每個字符添加到列表中,輸出: ['劉德華', '張柏芝', '林', '志', '穎']
print('3:',lst)
lst.extend(['張學友']) # 迭代列表, 輸出['劉德華', '張柏芝', '林', '志', '穎', '張學友']
print('4:',lst)
結果:
1: ['林志穎', '張學友', '劉德華', '張柏芝']
2: ['林志穎', '張學友', '周杰倫', '劉德華', '張柏芝']
3: ['劉德華', '張柏芝', '林', '志', '穎']
4: ['劉德華', '張柏芝', '林', '志', '穎', '張學友']
2.3.2:列表的刪除操作:
#刪除: pop,remove,clear,del
# 1:pop : 按照索引來刪除,默認刪除最後一個
lst = ['林志穎', '張學友', '劉德華', '張柏芝']
s = lst.pop() # 默認彈出最後一個,可以指定元素(索引)刪除;返回刪除的元素
print('1=',s) # 張柏芝
print('2=',lst) # ['林志穎', '張學友', '劉德華']
lst = ['林志穎', '張學友', '劉德華', '張柏芝']
s2 = lst.pop(1) # 輸出1號爲元素('張學友'), 輸出:['林志穎', '劉德華', '張柏芝']
print('3=',lst)
# 2: remove,按照元素值來刪除,刪除時元素值要存在於列表中,不然會報錯
lst = ['林志穎', '張學友', '劉德華', '張柏芝']
lst.remove('林志穎') # 指定元素(元素值) 輸出 : ['張學友', '劉德華', '張柏芝']
print('4=',lst)
# lst.remove('費玉清') # 報錯 ValueError: list.remove(x): x not in list
# print(lst)
# 3:clear,全部清空元素,但是列表還是存在的,只是爲空而已。
lst = ['林志穎', '張學友', '劉德華', '張柏芝']
print('5=',lst,id(lst))
lst.clear() # 元素全部清空,[]
print('6=',lst,id(lst))
# 4:del 輸出,指定索引來刪除,也可以切片刪除(即指定刪除範圍)
lst = ['林志穎', '張學友', '劉德華', '張柏芝']
del lst[1] # 指定元素(索引);['林志穎', '劉德華', '張柏芝']
print('7=',lst)
#可以切片刪除
lst = ['林志穎', '張學友', '劉德華', '張柏芝']
del lst[0:2] # 指定刪除範圍,輸出:['劉德華', '張柏芝']
print('8=',lst)
lst = ['林志穎', '張學友', '劉德華', '張柏芝']
lst[0:1] = []
print('9=',lst)
結果:
1= 張柏芝
2= ['林志穎', '張學友', '劉德華']
3= ['林志穎', '劉德華', '張柏芝']
4= ['張學友', '劉德華', '張柏芝']
5= ['林志穎', '張學友', '劉德華', '張柏芝'] 2085655857608
6= [] 2085655857608
7= ['林志穎', '劉德華', '張柏芝']
8= ['劉德華', '張柏芝']
9= ['張學友', '劉德華', '張柏芝']
2.3.3:列表的修改操作:
# 修改裏面的元素
lst = ['林志穎', '張學友', '劉德華', '張柏芝', '黃家駒', '周杰倫']
print('1=',lst)
# 通過單個索引來修改
lst[2] = '梁詠琪'
print('2=',lst) # ['林志穎', '張學友', '梁詠琪', '張柏芝', '黃家駒', '周杰倫']
lst = ['林志穎', '張學友', '劉德華', '張柏芝', '黃家駒', '周杰倫']
lst[-3] = '蜘蛛俠3'
print('3=',lst) # ['林志穎', '張學友', '劉德華', '蜘蛛俠3', '黃家駒', '周杰倫']
# 通過切片來修改
lst = ['林志穎', '張學友', '劉德華', '張柏芝', '黃家駒', '周杰倫']
lst[1:3] = '男兒本色'
print('4=',lst) #會迭代字符串 ['林志穎', '男', '兒', '本', '色', '張柏芝', '黃家駒', '周杰倫']
lst = ['林志穎', '張學友', '劉德華', '張柏芝', '黃家駒', '周杰倫']
lst[1:3] = ['男兒本色']
print('5=',lst) # ['林志穎', '男兒本色', '張柏芝', '黃家駒', '周杰倫']
# lst = ['林志穎', '張學友', '劉德華', '張柏芝', '黃家駒', '周杰倫']
# lst[1:5:2] = ['男兒本色'] #報錯 ValueError: attempt to assign sequence of size 1 to extended slice of size 2
# print(lst)
lst = ['林志穎', '張學友', '劉德華', '張柏芝', '黃家駒', '周杰倫']
lst[1:5:2] = ['男兒本色','男兒本色2'] # 注意如果元素的步長不是1,那麼元素的個數要匹配
print('6=',lst) # ['林志穎', '男兒本色', '劉德華', '男兒本色2', '黃家駒', '周杰倫']
結果:
1= ['林志穎', '張學友', '劉德華', '張柏芝', '黃家駒', '周杰倫']
2= ['林志穎', '張學友', '梁詠琪', '張柏芝', '黃家駒', '周杰倫']
3= ['林志穎', '張學友', '劉德華', '蜘蛛俠3', '黃家駒', '周杰倫']
4= ['林志穎', '男', '兒', '本', '色', '張柏芝', '黃家駒', '周杰倫']
5= ['林志穎', '男兒本色', '張柏芝', '黃家駒', '周杰倫']
6= ['林志穎', '男兒本色', '劉德華', '男兒本色2', '黃家駒', '周杰倫']
2.3.4:列表的查詢操作:
# 列表是一個可迭代對象
# 列表的查詢(或者說遍歷)
lst = ['林志穎', '張學友', '劉德華', '張柏芝', '黃家駒', '周杰倫']
for item in lst:
print(item)
for index,item in enumerate(lst):
print(index,item)
2.4列表的常用函數
# 查看列表的所有函數
# print(dir(list))
print([item for item in dir(list) if not item.startswith('__') ])
# print(help(list.index))
# 結果 ['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
# list.count(元素) ;元素個數,第一層元素的個數,不比較子元素中的值
lst = [1,2,33,2,2,1,3,[2,1,3]]
print('1--lst=',lst)
print('2--lst.count(2)=',lst.count(2))
# 元素在指定範圍第一次出現的位置
print('3--lst.index(2,2,)=',lst.index(2,2,))
# 排序,
lst = [7, 4, 9, 2,19,12]
# print(lst,id(lst))
lst.sort()
print('4--lst.sort() -->',lst,id(lst))
# 降序
lst = [7, 4, 9, 2,19,12]
# print(lst,id(lst))
lst.sort(reverse=True) # 降序
print('5--lst.sort(reverse=True) -->',lst)
#列表中元素的反轉
lst = [7, 4, 9, 2,19,12]
# print(lst)
lst.reverse()
print('6--lst.reverse() -->',lst)
# 複製列表
lst = [7, 4, 9, 2,19,12]
print(lst,id(lst))
lst2= lst.copy()
print(lst2,id(lst2))
2.5 列表的拷貝
Python中變量是對象的引用,把一個變量賦值給另外一個變量,其結果就是2個變量引用了一個相同的對象,他們指向了相同的對象。
lst1 = [1,2,3]
lst2 = lst1 # lst1,lst2 都指向了相同的對象
# id函數返回對象的內存地址(注意是對象的內存地址,而不是變量的),可使用 : print(help(id)) 查看說明;
print(id(lst1),id(lst2)) # 輸出的結果是一樣的 ;2386431167624 2386431167624 (每次運行,這個地址的輸出是不同的)
print('1---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3] lst2= [1, 2, 3]
# 由於lst1,lst2指向相同的對象,對lst1,lst2中任意一個的修改,都會影響到另一個;
lst2[0] = 100
print('2---lst1=',lst1,'lst2=',lst2) # lst1= [100, 2, 3] lst2= [100, 2, 3]
lst1[1] = 88
print('3---lst1=',lst1,'lst2=',lst2) # lst1= [100, 88, 3] lst2= [100, 88, 3]
"""
結果:
2386431167624 2386431167624
1---lst1= [1, 2, 3] lst2= [1, 2, 3]
2---lst1= [100, 2, 3] lst2= [100, 2, 3]
3---lst1= [100, 88, 3] lst2= [100, 88, 3]
"""
那麼怎麼拷貝列表的一份副本呢?
使用分片進行拷貝:
# 使用分片拷貝
lst1 = [1,2,3]
lst2 = lst1[:] # lst1,lst2 都指向了不同的對象
# id函數返回對象的內存地址(注意是對象的內存地址,而不是變量的),可使用 : print(help(id)) 查看說明;
print(id(lst1),id(lst2)) # 輸出的結果是不一樣的 ;2747197017224 2747197017288 (每次運行,這個地址的輸出是不同的)
print('1---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3] lst2= [1, 2, 3]
# 由於lst1,lst2指向不同的對象,對lst1,lst2中任意一個的修改,都不會影響到另一個;
lst2[0] = 100
print('2---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3] lst2= [100, 2, 3]
lst1[1] = 88
print('3---lst1=',lst1,'lst2=',lst2) # lst1= [1, 88, 3] lst2= [100, 2, 3]
"""
2747197017224 2747197017288
1---lst1= [1, 2, 3] lst2= [1, 2, 3]
2---lst1= [1, 2, 3] lst2= [100, 2, 3]
3---lst1= [1, 88, 3] lst2= [100, 2, 3]
"""
使用列表中的copy函數拷貝:
# 使用copy拷貝
lst1 = [1,2,3]
lst2 = lst1.copy() # lst1,lst2 都指向了不同的對象
# id函數返回對象的內存地址(注意是對象的內存地址,而不是變量的),可使用 : print(help(id)) 查看說明;
print(id(lst1),id(lst2)) # 輸出的結果是不一樣的 ;1734484479112 1734484479176 (每次運行,這個地址的輸出是不同的)
print('1---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3] lst2= [1, 2, 3]
# 由於lst1,lst2指向不同的對象,對lst1,lst2中任意一個的修改,都不會影響到另一個;
lst2[0] = 100
print('2---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3] lst2= [100, 2, 3]
lst1[1] = 88
print('3---lst1=',lst1,'lst2=',lst2) # lst1= [1, 88, 3] lst2= [100, 2, 3]
"""
1734484479112 1734484479176
1---lst1= [1, 2, 3] lst2= [1, 2, 3]
2---lst1= [1, 2, 3] lst2= [100, 2, 3]
3---lst1= [1, 88, 3] lst2= [100, 2, 3]
"""
深度拷貝:
# 使用copy拷貝,分片拷貝都存在一個問題,他們只能拷貝列表的頂層,
# 如果列表中嵌套了列表等,那麼就不能拷貝里面的列表。
lst1 = [1,2,3,[4,5,6]]
lst2 = lst1.copy() # lst1,lst2 都指向了不同的對象
# id函數返回對象的內存地址(注意是對象的內存地址,而不是變量的),可使用 : print(help(id)) 查看說明;
print(id(lst1),id(lst2)) # 輸出的結果是不一樣的 ;2278634146248 2278634147144 (每次運行,這個地址的輸出是不同的)
lst1[3][0] = 33 # 修改列表中嵌套的列表
print('1---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3, [33, 5, 6]] lst2= [1, 2, 3, [33, 5, 6]]
print('*'*30)
# 深度拷貝,需要引入一個模塊
import copy
lst1 = [1,2,3,[4,5,6],7]
lst2 = copy.deepcopy(lst1)
print(id(lst1),id(lst2)) # 輸出的結果是不一樣的 ;2278634571592 2278634146248 (每次運行,這個地址的輸出是不同的)
lst1[3][0] = 33 # 修改列表中嵌套的列表
lst2[3][1] = 44
print('1---lst1=',lst1,'lst2=',lst2) # lst1= [1, 2, 3, [33, 5, 6], 7] lst2= [1, 2, 3, [4, 44, 6], 7]
"""
輸出結果:
2278634146248 2278634147144
1---lst1= [1, 2, 3, [33, 5, 6]] lst2= [1, 2, 3, [33, 5, 6]]
******************************
2278634571592 2278634146248
1---lst1= [1, 2, 3, [33, 5, 6], 7] lst2= [1, 2, 3, [4, 44, 6], 7]
"""