1. 程式人生 > >python列表操作--淺拷貝深拷貝

python列表操作--淺拷貝深拷貝

列表的in / not in運算子

in 判斷一個物件是否在容器中,如果存在返回true,否則返回false

用法同字串 in 相同

語法:

資料物件 in 容器

示例:

l=[1,“34”,10,23,“富商大賈”]

1 in l True

“34” not in l False

10 in l True

23 in l True

4 not in l True

浮點數最好不要用於比較 存在一個精度問題

浮點數比較大小 可以比較兩個數的精度相差的很小

列表的索引

語法:

列表[整數表示式]

用法:

取值時等同於字串的索引操作

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

列表的索引賦值

列表是可變的序列可以通過索引賦值改變列表中的元素

示例:

l=[1,2,3,4]

l[2]=3.3 將第三個元素改成3.3

列表的切片

語法:

列表[:]

列表[::]

列表的切片取值時,返回一個列表,規則等同於字串切片規則

列表的切片賦值:

作用:

可以改變元列表排列順序,可以插入和修改資料

可以用切片改變列表的對應元素的值

語法:

列表[切片]=可迭代物件

ps:賦值運算子的右側必須是一個可迭代物件

示例:

,>>>l= [12, 45, 2, 3, 3, 4] -------改變的是列表本身,而不是繫結關係
,>>> l[0]
,>>> 12
,>>> l[1:]=[12,34,56,23,12]
,>>> l
,>>> [12, 12, 34, 56, 23, 12]
,>>> l[:]=[11,22,34,55,66]
,>>> l
,>>> [11, 22, 34, 55, 66]
,>>> l=[1,2]
,>>> l[1:1]=[3] ---------實現中間插入[3]
,>>> l
,>>> [1, 3, 2]

,>>> l=[1,2,3]
,>>> l[0:0]=[6,7,8]
,>>> l
,>>> [6, 7, 8, 1, 2, 3]

,>>> l=[1,4]
,>>> l[1:1]=range(2,4)
,>>> l
,>>> [1, 2, 3, 4]

,>>> l=[2,3,4]
,>>> l[1:2]=“asd”
,>>> l
,>>> [2, ‘a’, ‘s’, ‘d’, 4]

切片賦值的注意事項

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

例:

l=[1,2,3,4,5,6]

l[::2]=“asd” 對的

#以下切出三段,但給出5個元素填充是錯的

l[::2]=“asdfg”

a=“hello”
a+=“world”

a
‘helloworld’ -----------------改變的是a的繫結關係而不是a,原來的字串並沒有變化!!!!

刪-del語句

用於刪除列表中的元素

語法

​ del 序列[整數表示式]

​ del 序列[切片]

示例:

l=[1,2,3,4,5,6]

del l [-1] 刪除最後 一個

del l [0] 刪除第一個

del l [0:0:2] 刪除1,3,5

python中常用語序列的函式:

len(seq) 返回容器的元素個數

max(x) 返回序列的最大值元素

min(x) 返回序列的最小值元素

sum(x) 返回序列中所有元素的和(元素必須是數值型別)

any(x) 真值測試,如果容器內其中一個值為True則返回True,否則返回False

all(x) 真值測試,容器內所有元素的布林值為True才返回True

Python中常用的列表方法

.index 返回元素對應的索引

.insert (index,obj) 將某個元素插入到列表裡的相應的索引處

.append(x) 在列表末尾追加一個元素

.count(x) 返回列表中相同元素的個數

.remove(x) 從列表中刪除第一次出現的元素

.extend(list) 在列表末尾追加一個列表,不是列表的巢狀

.append(list) 此時才是列表的巢狀

.sort() 把原來的列表從小到大排序

.sort(reverse) 把原來的列表從大到小排列,預設reverse=false

.reverse() 列表反i轉

.pop(index) 刪除某個元素,通過索引刪 。不給索引,刪除最後一個

,>>>L=[2,3,5,7]

,>>>L2=L -------------------這裡是賦值

,>>>L2.remove(5)

,>>>L2

,>>>[2,3,7]

,>>>L

,>>>[2,3,7]

,>>>L=[2,3,5,7]

,>>>L2=L[:] --------------------這裡是切片,跟複製一樣

,>>>L2.remove(5)

,>>>L2

,>>>[2,3,7]

,>>>L1

,>>>[2,3,7]

,>>> l=[12,34,5]

,>>> l.extend([5,6,7])
,>>> l
,>>> [12, 34, 5, 5, 6, 7]
,>>> l.append([12,45,67])
,>>> l
,>>> [12, 34, 5, 5, 6, 7, [12, 45, 67]]

練習:

寫一個程式,讓使用者輸入很多個整數,當輸入小於0的數是結束輸入

1)輸出這些數的和 sum

2)輸出這些數的最大的數和第二大的數 max l.remove

3)刪除最小的數

4)按照原來的輸入順序打印出剩餘的數

淺拷貝和深拷貝

deep copy

淺拷貝 shallow copy

是指在複製過程當中,只會複製一層變數,不會複製深層變數

示例:

L=[3.1,3.2]

L1=[1,2,L]

L2=L1.copy() 淺拷貝

L[0]=3.14

L1 =[1,2,[3.14,3.2]]

L2=[1,2,[3.14,3.2]]

L1[2] 和 L2[2] 共同擁有L繫結的物件

python中的變數不儲存任何資料,只是一種繫結關係,不佔用記憶體,執行快,效率高

在淺拷貝的過程中,只複製一層,只拷貝了列表中的物件,但是物件繫結的還是原始變數(並沒有改變物件的繫結關係)

深拷貝:

示例:

import copy

L[3.1,3.2]

L1=[1,2,L]

L2=copy.deepcopy(L1) 深拷貝 遞迴地拷貝

L[0]=3.14

L1 =[1,2,[3.14,3.2]]

L2=[1,2,[3.1,3.2]] 此列表不受影響

注意事項:

深拷貝通常只對可變物件進行深層複製,不可變物件通常不會被複制

Python中的物件不可變

理解:

L1=[1,2,[3.1,3.2]]

L2=L1

L3=L1.copy() 用id()函式驗證 地址相同

L4=L1.copy.deedcopy(L1)

問題:

如何把L1裡的3.1改成3.14

L1[2][0]=3.14

列表和字串比較

  1. 列表和字串都是序列,元素之間有先後關係
  2. 字串是不可變的序列,列表式可變的序列
  3. 字串中每個元素只能儲存字元,二列表可以儲存任意型別的元素
  4. 列表和字串都是可迭代物件
字串文字解析方法

split和join

S.split(sep=None)

將字串使用sep作為分隔符分割S字串,返回分割後的字串列表,當不給定引數時,用空白字串作為分隔符分割

S.join(iterable)用可迭代物件中的字串,返回一箇中間用S進行分割的字串

示例:

s=“Beijing is capital”

L=s.spilt(“ “)

L=[“Beijing”,“is”,“capital”] -------------在有空格處分割

L=[“C:”,“Programe files”,“python3”]

s= ‘ \ \ ’ .join(L)

#s=“C\Programe files\python3”

練習:

有字串“hello”,生成“h e l l o”和“h-e-l-l-o” 用互動模式完成

列表推導式

list comprehension

列表推導式是用可迭代物件一次生成帶有多個元素列表的表示式

作用:

用簡易方法生成列表

語法:

[表示式 for 變數 in 可迭代物件]

[表示式 for 變數 in 可迭代物件 if 真值表達式 ]

問題

如何生成[1,4,9,16.。。81]?

L=[]

for x in range(1,10)

L.append(x**2)

用列表推導式生成:

L=[x**2 for x in range(1,10)]

練習

用列表推導式生成1-100內 奇數列表

L=[x for x in range(1,100,2)]

示例:

生成[1,9,25,49,81]列表,跳過所有偶數

[x**2 for x in range(1,10) if x%2==1]

練習

輸入一個數值作為開始數 用begin繫結

再輸入一個結束的整數用end繫結

將開始至結束的數中,n的平方+1,能被5整除的數放入列表中

請輸入開始數:1

請輸入結束數:20

n如果(n**2+1)%5==0則把n加入列表中

結果:

[2,3,7,8,12,13。。。]

begin=int(input(“請輸入開始數:”))

end=int(input(“請輸入結束數:”))

[n for n in range(begin,end+1) if (n**2+1)%5==0]

[2, 3, 7, 8, 12, 13, 17, 18]

列表推導式的巢狀

語法:

[表示式1

​ for 變數 1 in可迭代物件1 if 真值表達式1

​ for 變數2 in可迭代物件2 if 真值表達式2]

示例:

想生成[“A1”,“A2”,“A3”,“B1”,“B2”,“B3”,“C1”,“C2”,“C3”]

[x+y for x in “ABC” for y in “123”] --------------字串也是可迭代的!

練習

1.輸入一個整數n 代表結束的數,將1-n之間所有的素數計算出來,並存入到列表

素數是指除了1和它本身以外不被其他正整數整除

1)最後列印此列表中的全部素數

2)列印這些素數的和

l=[]
sum=0
i=int(input("請輸入結束數:"))
for x in range(1,i+1) :
    b=0
    for n in range(2,x):
        if x%n!=0:
            b+=1
            continue
if b==x-2 or x==1:
    l.append(x)
x+=1
for x in l:
    sum+=x
print(l,sum)

2.求100以內有哪些整數與自身加 1的乘積在11求餘的結果等於8

​ 列印這些數

​ 將這些數存於列表當中(嘗試使用列表推導式)

,>>>[x for x in range(1,101) if x*(x+1)%11==8]

,>>>[5, 16, 27, 38, 49, 60, 71, 82, 93]

3.計算20個斐波那契數,存於列表中,列印這20數

​ 1,1,2,3,5,8,13。。

從第三個數起,後一個數是前兩個數之和

l=[1,1]
a=1
while a>=1:
    a+=1
    if a==l[-1]+l[-2]:
        l.append(a)
    if len(l)==20:
        break
print(l)