Python3中的列表


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]
"""

 

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