python中的切片操作


之前在做畢業設計的時候隨手寫過python中“:”的作用,即python的切片操作。

記得剛開始學切片這一節的時候,看完之后,做了作業,感覺記憶深刻。學到后面很多地方都可以用到切片,這時候切片早已被我忘得一干二凈。

這里參考其他的博客進行復習&說明&(自用)  如下:

 

 基本

冒號: 用於定義分片、步長。

a[ : n]表示從第0個元素到第n個元素(不包括n),a[1: ] 表示該列表中的第1個元素到最后一個元素。

list1[:3:2],tul1[3:6:2](注意3:6是索引第3至5,不包含6)

 

L[2] 讀取列表中第三個元素,也即第2個元素

L[-2] 讀取列表中倒數第二個元素

L[1:] 從第二個元素開始截取列表

 

list1 = [1,2,3,4,5]
print list1
print list1[:-1]

輸出結果:

[1, 2, 3, 4, 5]
[1, 2, 3, 4]

 

L=list(range(10))
L1=L[0:3]  #從索引0開始取,直到索引3為止,但不包括索引3
#運行結果:[0, 1, 2]
L2=L[:3]   #如果第一個索引是0,還可以省略
#運行結果:[0, 1, 2]
L3=L[:-1]  #Python支持L[-1]取倒數第一個元素,那么它同樣支持倒數切片,倒數第一個元素的索引是-1
#運行結果:[0, 1, 2, 3, 4, 5, 6, 7, 8]
L4=L[1:8:2] #前8個數,每兩個取一個
#運行結果:[1, 3, 5, 7]
L5=L[::-1]  #倒敘取每一個數
#運行結果:[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
L6=L[:]     #只寫[:]就可以原樣復制一個list
#運行結果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

python創建二維列表list_2d = [[0 for col in range(cols)] for row in range(rows)]

>>> list_2d = [ [0 for i in range(5)] for i in range(4)]
>>> list_2d[0].append(3)
>>> list_2d[0].append(5)
>>> list_2d[2].append(7)
>>> list_2d

結果為[[0, 0, 0, 0, 0, 3, 5], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 7], [0, 0, 0, 0, 0]]

 

range() 函數可創建一個整數列表,一般用在 for 循環中。

函數語法

range(start, stop[, step])

參數說明:

start: 計數從 start 開始。默認是從 0 開始。例如range(5)等價於range(0, 5)

stop: 計數到 stop 結束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5

step:步長,默認為1。例如:range(0, 5) 等價於 range(0, 5, 1)

倒序

>>> range(100,19,-5)

結果:[100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20]

xrange() 函數用法與 range 完全相同,所不同的是生成的不是一個數組,而是一個生成器

xrange不想寫了.....以后有時間再整理吧......

 

part 1 查找

names_class2 = ['張三', '李四', '王五', '趙六']
print(names_class2[2])
# print(names_class2[0:3])
# print(names_class2[0:7])
# print(names_class2[-1])
# print(names_class2[2:3])
# print(names_class2[0:3:1])
# print(names_class2[3:0:-1])
# print(names_class2[:])

part 2 增(append insert)

insert 方法用於將對象插入到列表中,而append方法則用於在列表末尾追加新的對象

names_class2.append('alex') 
names_class2.insert(2,'alvin') 
print(names_class2) 

 

part 3 重新賦值

1 names_class2=['張三','李四','王五','趙六'] 
2   
3 names_class2[3]='趙七'
4 names_class2[0:2]=['wusir','alvin'] 
5 print(names_class2)

 

part 4 刪(remove,del,pop)

1 names_class2.remove('alex') 
2 del names_class2[0] 
3 del names_class2 
4 names_class2.pop()#注意,pop是有一個返回值的  

 

part 5 其它

5.1 count

>>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')   
 
>>> x = [[1,2], 1, 1, [2, 1, [1, 2]]]   
>>> x.count(1)   
 
>>> x.count([1,2])

 

5.2 extend

 extend 方法可以在列表的末尾一次性追加另一個序列中的多個值。

1 >>> a = [1, 2, 3]   
2 >>> b = [4, 5, 6]   
3 >>> a.extend(b)   
4 >>> a   
5 [1, 2, 3, 4, 5, 6] 

extend 方法修改了被擴展的列表,而原始的連接操作(+)則不然,它會返回一個全新的列表。

>>> a = [1, 2, 3]   
>>> b = [4, 5, 6]   
>>> a.extend(b)   
>>> a   
[1, 2, 3, 4, 5, 6]   
>>>   
>>> a + b   
[1, 2, 3, 4, 5, 6, 4, 5, 6]   
>>> a   
[1, 2, 3, 4, 5, 6]

 

5.3  index

       index 方法用於從列表中找出某個值第一個匹配項的索引位置:

names_class2.index('李四')

5.4  reverse

   reverse 方法將列表中的元素反向存放。

names_class2.reverse() 
print(names_class2) 

5.5  sort

       sort 方法用於在原位置對列表進行排序。

x = [4, 6, 2, 1, 7, 9] 
x.sort()  #x.sort(reverse=True) 

5.6  深淺拷貝

現在,大家先不要理會什么是深淺拷貝,聽我說,對於一個列表,我想復制一份怎么辦呢?

肯定會有同學說,重新賦值唄:

names_class1=['張三','李四','王五','趙六'] 
names_class1_copy=['張三','李四','王五','趙六'] 

這是兩塊獨立的內存空間

這也沒問題,還是那句話,如果列表內容做夠大,你真的可以要每一個元素都重新寫一遍嗎?當然不啦,所以列表里為我們內置了copy方法:

names_class1=['張三','李四','王五','趙六',[1,2,3]] 
names_class1_copy=names_class1.copy() 
  
names_class1[0]='zhangsan'
print(names_class1) 
print(names_class1_copy) 
  
############ 
names_class1[4][2]=5
print(names_class1) 
print(names_class1_copy) 
  
#問題來了,為什么names_class1_copy,從這一點我們可以斷定,這兩個變量並不是完全獨立的,那他們的關系是什么呢?為什么有的改變,有的不改變呢?

這里就涉及到我們要講的深淺拷貝了:

#不可變數據類型:數字,字符串,元組         可變類型:列表,字典 
  
# l=[2,2,3] 
# print(id(l)) 
# l[0]=5 
# print(id(l))   # 當你對可變類型進行修改時,比如這個列表對象l,它的內存地址不會變化,注意是這個列表對象l,不是它里面的元素 
#                # this is the most important 
# 
# s='alex' 
# print(id(s))   #像字符串,列表,數字這些不可變數據類型,,是不能修改的,比如我想要一個'Alex'的字符串,只能重新創建一個'Alex'的對象,然后讓指針只想這個新對象 
# 
# s[0]='e'       #報錯 
# print(id(s)) 
  
#重點:淺拷貝 
a=[[1,2],3,4] 
b=a[:]#b=a.copy() 
  
print(a,b) 
print(id(a),id(b)) 
print('*************') 
print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 
print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 
print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 
print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 
print('a[2]:',id(a[2]),'b[2]:',id(b[2])) 
  
  
print('___________________________________________') 
b[0][0]=8
  
print(a,b) 
print(id(a),id(b)) 
print('*************') 
print('a[0]:',id(a[0]),'b[0]:',id(b[0])) 
print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0])) 
print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1])) 
print('a[1]:',id(a[1]),'b[1]:',id(b[1])) 
print('a[2]:',id(a[2]),'b[2]:',id(b[2]))

對該結果的解釋

 

--------------------------------------------------------------------------------------------------------

應用練習

#利用切片操作,實現一個trim()函數,去除字符串首尾的空格
def trim(s):
    while s[:1]==' ':  #while循環判斷第一個元素是否為空
        s=s[1:]     #為空的話將第一個元素截取
    while s[-1:]==' ':  #while循環判斷最后一個元素是否為空
        s=s[:-1]     #為空的話將最后一個元素截取
    return s

 

#回數是指從左向右讀和從右向左讀都是一樣的數,例如12321,909。利用filter()篩選出回數:
def is_palindrome(n):
    if str(n)==str(n)[::-1]:  #判斷從左向右讀和從右向左讀是否都是一樣的數
        return n
print(list(filter(is_palindrome,list(range(100)))))

 


免責聲明!

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



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