Python 列表(list)與淺拷貝深拷貝介紹


列表 list

問題:

  容器

如何將計算運算的數據臨時存在一個地方,同時又方便 添加,刪除,修改等操作?

什么是列表:

列表是一種容器

列表是可以被改變序列

列表是由一系列特定元素組成的,元素與元素之間可能沒有任何關聯關系,但他們之間有先后順序關系聯關系,但他們之間有先后順序關系

python3中序列類型簡介:

字符串 str  列表 list  元組 tuple  字節串 bytes  字節數組 bytearray

創始空列表的字面值

L = [] # L綁定空列表

注: 表達式[] 會創建一個空的列表

創建非空列表的字面值

L = [1,2,3,4]
L = ["北京","上海","深圳"]
L = [1,"Two",3.14,"四"]
L = [1,2,[3.1,3.2],4]

列表的構造(創建)函數 list

list()            # 創建一個空的列表,等同於[]
list(iterable(可迭代))  # 用可迭代對象創建一個列表
# 示例:
L = list()              # L 綁定空列表等同於 L = [] 
L = list("hello")       # L = ["h","e","l","l","o"]
L = list(range(1,10,2)) # L = [1,3,5,7,9]

列表的運算

# 算術運算:
+   +=   *   *= 
# + 用於拼接列表
x = [1,2,3]
y = [4,5,6]
z = x+y   # z = [1,2,3,4,5,6]
# += 將原列表與右側的可迭代對象的數據追加,得到新的列表
# 語法:
#    x += 可迭代對象
# 如:
x = [1,2,3]
x += [4,5,6]
x += "ABC"
x += range(1,10,3)
# 注:
#    += 運算符是用原可迭代對象的數據進行追加,原列表的ID不變
# 如:
s = "ABC"
print(id(s))   #???
s += "123"
print(id(s))   # 和上面的不相同
L = [1,2,3]
print(id(L))  #???
L = "123"
print(id(L))   # ???
# * 生成重復的列表
x = [1,2] * 3    # x = [1,2,1,2,1,2]
# *=  生成重復的列表,用原變量綁定更新后的列表
x = [1,2,3]
x = 2   #[1,2,3,1,2,3]

列表的比較運算:

# 運算符:
<  <=  >  >=  ==  !=

說明:

  列表的比較規則與字符串的比較規則相同

  列表要求每兩個元素能依次進行比較,否則會出現類型錯誤

# 示例:
[1,2,3] == [1,2,3]               # True
[1,2,3] != [1,3,2]               # True
[1,2,3] < [1,3,2]                # True
[1,2,3] >= [1,2]                 # True
[1,"Two"] > ["Two",1]            # TypeError (語法錯誤)
[1,"two",3.14] < [1,"",2.8]    # True 

列表是可迭代對象

L = [1,3,5,7]
for x  in L:
  print(x) # 打印 1 3 5 7

列表的 in / not in 運算符

判斷一個值是否存在於列表中,如果存在返回True,否則返回False

(同字符串的in和not in 用法相同)

not in 返回值與in 相反

# 示例:
x = [1,"Two",3,""]
3 in x        #True
"3" in x      #False
10 in x       #False
10 not in x   #True

練習:

寫一個程序,讓用戶輸入很多個正整數,當輸入負數時結束輸入,將用戶輸入的數存於列表L中,打印這個列表

如:

請輸入:1  請輸入:2  請輸入:3  請輸入:4  請輸入:-1

打印如下:

  [1,2,3,4]

# L = []
x = int(input("請輸入:"))
L += [x]   # 把x 放在列表中,追加到L的末尾
L =[] # 創建一個列表,准備存放數字
while True:
  # 每次輸入一個數,如果次數小於0,則退出循環,否則把
  # 這個數放在列表中
  x= int(input("請輸入:"))
  if x < 0:
    break
    L += [x]
print("列表的內容是:",L)

列表的索引操作

語法:

列表[整數表達式]

用法:

等用於字符串的索引

索引分為正向索引和反向索引,規則寫字符串索引規則完全相同

# 示例:
L = [1,2,3,4]
print(L[1])   #2
print(L[-1])  #4
# 注
# 列表是可變的序列, 列表支持索引賦值,列表可以通過索引賦值改變

列表中的元素

# 語法:
#    列表[整數在表達式] = 表達式
# 示例:
L = [1,2,3,4]
L[2] = 3.14     # 改變了第三個元素的值

列表的切片操作

# 取值:
#    列表[起始值:終止值]
#    列表[起始值:終止值:步長]
#    列表的切片取值返回一個列表,規則等同於字符串切片規則
# 示例;
L = list(range(10))
L2 = L[::2]    # L2 = (0,2,4,6,8)

列表的切片賦值

# 作用:
#    可以改變源列表的排列,可以插入,修改和刪除數據
# 語法:
#    列表[切片] = 可迭代對象
# 說明:
#    切片賦值的賦值運算符(=)的右側必須是一個可迭代對象
# 示例:
L = [2,3,4]
L[0:1] = [1.1,2.2]         # L = [1.1,2.2,3,4]
L[2:] = [3.3,4.4,5.5]      # L = [1.1, 2.2, 3.3, 4.4, 5.5]
L[1:4] = []                # 切出 2.2,3.3,4.4 ,沒加入新數據
L[1:] = range(5,9)         # L=[ 1.1, 5, 6, 7, 8]
L = [2,5]
L[1:1] = [3,4]            # L=[2,3,4,5]
L[0:0] = range(2)          # L = [0,1,2,3,4,5] 
L[6:] =[6,7]               # L = [0,1,2,3,4,5,6,7]

切片注意事項:

對於步長不等於1的切片賦值,賦值運算符的右側的可迭代對象提供的元素的個數,一定要等於切片的段數

L = [1,2,3,4,5,6]
L[::2] = "ABC"          #對的
L[::2] = "ABCDE"        #錯的
# del  語句用於刪除列表的元素
# 語法:
#    del 列表[索引]  #刪除索引
#    del 列表[切片]  #刪除切片
# 示例:
L = [1,2,3,4,5,6,7] 
del L[-1]   #L = [1,2,3,4,5,6]
del L[::2]  #L = [2,4,6]
# 練習;
# 已知有列表:
# L = [3,5]
#(1)用索引和切片操作,將原列表改變為:
# L = [1,2,3,4,5,6]    
l = [3,5]l[1:1] = [4]l[3:] = [6]l[len(l):] = [7] # 在長度最后一個插入l[0:0]  =[1,2]print(l)
print(id(l))
#(2)將列表反轉,刪除最后一個元素后,打印此列表: #   ... #   print(L) #[6,5,4,3,2] # 將列表反轉 l[::] = l[::-1] #ID 不變 del l[-1] print(l)
print("l=",id(l))

python3 中常用於序列的函數:

len(x)    # 返回序列的長度  
max(x)    # 返回序列的最大值元素
min(x)    # 返回序列的最小值元素
sum(x)    # 返回序列中所有元素的和(元素必須是數值類型)(全部相加)
any(x)    # 真值測試,如果列表中其中一個值為真值則返回True
all(x)    # 真值測試,如果列表中所有值為真值才返回True,否則返回False
# 序列函數
reversed(seq)   # 返回原序列反向順序的可迭代對象
sorted(iterable,reverse=False)   # 返回已排序的列表
# 示例:
L = [8,3,6,2,7]
print(len(L))  # 5 
print(max(L))  # 8
print(min(L))  # 2
print(sun(L))  # 26
print(any(x))  # True
print(all(x))  # True
# 示例:
L = [1,2,3,4]
for x in L:
  print(x)   # 1 2 3 4 
for x in reversed(L):  
  print(x)   # 4 3 2 1
L2 =[5,8,3,7,1]
L3 = sorted(L2)   # L3 = [1,3,5,7,8]
L4 = sorted(L2,reverse=True)  # 降序排序 L4 = [8,7,5,3,1]

練習:

# 1,寫程序,讓用戶循環輸入一些正整數,當輸入-1時結束輸入,將這些整數存於列表L中。
#    1)打印出你共輸入了幾個有效的數(不算結束的-1)
#    2)打印你輸入的最大數是多少?
#    3)打印你輸入的最小數是多少?
#    4)打印你輸入的這些數的平均值是多少?

l = []# 創建空列表
while True:
    n = int(input("請輸入整數:"))
    if n == -1:
        break  # 停止輸入
    l += [n]  # 空列表加上轉N列表
print("已輸入:",l)
print("你共輸入了%d個有效的數:"% len(l))
print("最大值是:",max(l))
print("最小值是:",min(l))
print("你輸入的這些數的平均值是:",sum(l)/len(l))
# 2.寫一個程序,讓用戶輸入兩個或以上的正整數,當輸入小於零的數時結束輸入(不允許輸入重復的數)
#    1)打印這些數的和
#    2)打印這些數的最大數
#    3)打印這些數的最二大的數
#    4)刪除最小的一個數,並打原來的列表

l = []  # 創建一個容器,用變量來綁定
while True:
    n = int(input("請輸入整數:"))
    if n < 0:
        if len(l)<2:        
            print("請重新輸入兩次以上整數")
            continue
        break
    if n not in l:
      l += [n]
print('和是:',sum(l))
l = sorted(l)
print("最大數是",l[-1])
print("最二大數是:",l[-2]) 
i = l[0]
for x in range(len(l)):
  if l[x] == i:
    del l[x]
    break
print(l)

 python3 中常用的列表方法

# 方法                                 # 意義
L.index(v [, begin[, end]])          # 返回對應元素的索引下標, begin為開始索引,end為結束索引,當 value 不存在時觸發ValueError錯誤
L.insert(index, obj)                  # 將某個元素插放到列表中指定的位置
L.count(x)                            # 返回列表中元素的個數
L.remove(x)                           # 從列表中刪除第一次出現在列表中的值
L.copy()                              # 復制此列表(只復制一層,不會復制深層對象)
L.append(x)                           # 向列表中追加單個元素
L.extend(lst)                         # 向列表追加另一個列表
L.clear()                             # 清空列表,等同於 L[:] = []
L.sort(reverse=False)                # 將列表中的元素進行排序,默認順序按值的小到大的順序排列
L.reverse()                           # 列表的反轉,用來改變原列表的先后順序
L.pop([index])                        # 刪除索引對應的元素,如果不加索引,默認刪除最后元素,同時返回刪除元素的引用關系

練習:

# 練習:
# 輸入多行文字,存入列表中
# 每次輸入后回車算作一行,任意輸入多行文字
# 當直接輸入回車(退空行時算作輸入結果)
#    要求:
#        1)按原輸入的內容在屏幕上輸出內容
#        2)打印出你共輸入了多少文文字
#        3)打印出你共輸入了多少行字符
# 如:
#    請輸入:ABC
#    請輸入:abc
#    請輸入:123
#    請輸入:《回車》
#    你輸入的內容是:
#    ABC
#    abc
#    123
#    你輸入了3行文字
#    你輸入了9個字符        
l = []
while True:
    s = input("請輸入:")
    if not s:  # 當輸用戶直接輸入回車時,得到空字符串
        break
        l.append(s) # 將字符串s追加到l列表末尾
print(l)
print("你輸入的內容是:")
for text in l:
    print(text)
print("你輸入了",len(l),"行文字")
count = 0
for text in l:
    count += len(text)  #把每一行字符串長度累加到count中
print("你輸入兩",count,"個字符")

深拷貝 和 淺拷貝

淺拷貝  shallow copy

# 淺拷貝是指在復制過程中,只復制一層變量,不會復制深層變量綁定的對象的復制過程
# 如:
L1 = [1,2,[3.1,3.2]]
L2 = L1.copy()
L2[2][0] = 3.14
print(L1)  # [1,2,[3.14,3.2]]
print(L2)  # [1,2,[3.14,3.2]]

深拷貝  deep copy

# 深拷貝會在復制過程中,逐漸復制深層對象,實現兩個對象的完全獨立
# 如:
# deepcopy
import copy  #導入考拷貝模塊
L1 = [1,2,[3.1,3.2]]
L2 = copy.deepcopy(L1)
L2[2][0] = 3.14
print(L1)  # [1,2,[3.1,3.2]]
print(L2)  # [1,2,[3.14,3.2]]  
# 小結:
L1 = [1,2,[3.1,3.2]]
L2 = L1   #不拷貝
L3 = L1.copy()  #淺拷貝
import copy
L4 = copy.deepcopy(L1)  # 深拷貝

列表與字符串比較:

列表和字符串都是序列,元素之間有先后關系

字符串中每個元素只能存儲字符,而列表可以存儲任意類型 的元素

字符串是不可變的序列,而列表是可變的序列

列表和字符串都是可迭代對象

字符串的文本解析方法

# 方法名                        # 說明    
S.split(sep=None)              # 將字符串,使用sep作用分隔符分割S字符串返回分割后的字符串列表,當不給定參數時,用空白符作為分隔符
S.splitlines()                 # 將字符串接換行符“\n” 分為分隔符進行分割返回分割后的列表
S.join(iterable)               # 用可迭代對象中的字符串,返回一個是中間 (在字符串中加上字符)用S進行分隔的字符串
# 示例:
s = 'Beijing is capital'
L = s.split()              # L = ["Beijing","is","capital"]
s2 = "-".join(L)           # s2 = "Beijing-is-capital"

練習:

# 有字符串"hello"  生成字符串"h e l l o" 和"h- e-l-l-o"
s = "hello"  
s2 = " ".join(s)
s2 = "-".join(s)

創建列表的方法有幾種:

# 字面值:
    [1,2,3]
# 構造函數:
list(range(1,4))

列表推導式 list comprehension

列表推導式用可迭代對象創建列表的表達式

# 作用:
#    用簡易方法生成列表
# 語法:
#    [表達式 for 變量 in 可迭代對象]
#
#    [表達式 for 變量 in 可迭代對象 if 真值表達式]

# 示例:
# 生成一個數值為1~9的整數的平方的列表,如:
L = [1,4,9,16,25,36,49,64,81]
# 用循環語句:
L = []
for x in range(1,10):
    L.append(x ** 2)

練習:

# 用列表推導式生成 1~ 100  內所有奇數組成的列表結果是:[1,3,5,7,......,99]
# 示例:
生成一個數值為1~9的奇數的平方的列表,如:
L = [1,9,25,49,81]
L = [x**2 for x in range(1,10)if x % 2 == 1]

列表推導式的嵌套:

# 語法:
[表達式 for 變量1 in 可迭代對象1 if 真值表達式1 for 變量2 in 可迭代對象2 if 真值表達式2 ....]
# 示例:
# 將列表[10,20,30] 中的元素與列表[1,2,3] 元素分別相加,將得到的元素放於一個列表中...
L = [x+y for x in [10,20,30] for y in [1,2,3]]
print(L)     #[11,12,13,21,22,23,31,32,33]

練習:

# 用字符串"ABC"和"123" 生成如下列表:
["A1","A2","A3","B1","B2","B3","C1","C2","C3"]
 
l = [x+y for x in "ABC" for y in "123"]
print(l)
# 生成一個列表,此列表為x的平方加1不能被5整數的數的列表條件:(x ** 2 + 1) % 5 !=0
# x 的取值范圍是:0<= x < 100

l = [x for x in range(0,100) if (x **2 + 1 )% 5 !=0]
print(l)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM