pythonalist是什么意思_3. Python3轻食丨一个故事看懂List所有用法:1年级1班的班级生活...
List(列表)知識:1年級1班的班級生活
1.1 列表是個啥:List(列表)的基礎知識:
今天我們來講Python六大數據類型的第一種:List(列表)。本文將引入一個1年級1班的班級故事,本故事將貫穿教程始末,力求讓每一個小知識點第一次出現在你面前時,都是靈活而可愛的。通過本文的學習后,你就能掌握關于List(列表)的所有相關知識了。那,跟著我一起看下好不啦?
A.List是啥?
a. List屬于序列:序列共有 List 、 Turple 、 字符串 、 Unicode字符串 、 buffer對象 和 xrange對象 六種,所有序列都存在內部的索引(將在后文提及)。
b. List屬于標準數據類型:Python標準數據類型共有 Number(數字) 、 String(字符串) 、 List(列表) 、 Turple(元組) 、 Set(集合) 、 Dictionary(字典) 六類。
B.List有啥特征?
我們先來看幾個List(序列)長啥樣:
>>> a = ['Think','123456','[1,2,3]']
觀察可以看到:
a. 序列的基本結構為:變量 = [ ] ,即變量 、= 和 []。
b. 序列內的數據類型:不要求一致,可以有多種并存,甚至一個List里面還可以包含其他List。被包含的"子List"此時作為“母List”的元素。
c. 序列內的元素:序列內的內容為元素,元素數目可以為0,即空集 a = [] ;元素之間用 , 分隔開;如果元素為字符串,應用 ’ 或者 " 括起來。
C. 序列可以進行的基本操作:最基礎的基本操作一共有五種:索引 、切片、加、乘、 檢查,將在后文中進行詳細解釋。
1.2 可以對列表做啥:List(列表)的操作
a. 創建:1年級1班開學了!
我們假設1年級1班開學了,一共有李布爾、王多魚、蘇大強三名小朋友入學。我們簡稱1年級1班的班名為one,現在我們要打印出這個班級的同學名單:
>>> one = ['李布爾','王多魚','蘇大強'] >>> one ['李布爾', '王多魚', '蘇大強']
用中括號[ ]創建一個列表賦給one。當然班級也可以沒人,比如隔壁1年級2班沒人,list可以是空的:
>>> two = []
>>> two
[]
b. 計數 :班里有幾個人?
這時候老師想知道1年級1班有幾個人,三個人很容易數出來,可如果想知道全校的人數呢?需要調用 len(班級名) 這個語句來計數列表內的元素長度(數目):
>>> one = ['李布爾','王多魚','蘇大強'] >>> len(one) 3
注意:空list也可以用len,空list長度為0。比如我們看看慘淡的1年級2班:
>>> two = [] >>> len(two) 0
c. 訪問元素:班里都是按學號點名的!
在學校里,每名同學都有自己的學號,這就是列表中的元素索引。
學號的制定規律:
1.在一個有人的班級中,每名同學都有兩個學號(即索引),這個學號是以他們在整個班級中的相對位置確定的。
2.正數第一位學號為0,正數第二位學號為1…倒數第一位學號為-1,倒數第二位學號為-2。即:正數索引為n-1,倒數索引為-n。
比如以1年級1班為例:
>>> one = ['李布爾','王多魚','蘇大強']
王多魚是正數第一位同學、倒數第三位同學。所以他的學號就有0和-3兩個。
當老師想點名的時候,要用班級名[學號]的方式點學號。例如點二號同學:
>>> one = ['李布爾','王多魚','蘇大強']
>>> one[2]
'蘇大強'
如果老師想知道某個同學的姓氏怎么辦?對于列表內的元素我們還可以繼續切割:
>>> one = ['李布爾','王多魚','蘇大強'] # 查看 1年級1班 學號為 0 的同學姓名:
>>> name = one[0] # 取該姓名索引為0的字符:
>>> name [0]
'李'
如果老師想叫多位同學,比如想叫從1號開始后面的所有同學呢?
>>> one = ['李布爾','王多魚','蘇大強']
>>> one[1:]
['王多魚', '蘇大強']
我們可以看到,就成功把1號和2號同學叫出來了。這里用的是切片的方式,即班級名[從第幾號學生開始:截止到第幾號學生之前],從第n號開始的全部可以用班級名 [n:],截止到n號之前的全部可以用班級名[:n]。
d. 追加元素 :1年級1班的新生
班里轉來了一名新生,叫史曉明。我們用班級名.append(新同學名字) 的方式將他添到班級名單里,按照先來后到的規則,他自然排在最后:
第一種情況:默認添加新元素到列表末尾
>>> one = ['李布爾','王多魚','蘇大強']
>>> one.append('史曉明')
>>> one
['李布爾', '王多魚', '蘇大強', '史曉明']
這時候‘王多魚’ 小朋友家財大氣粗的派來一名隨讀保鏢,強烈要求學號和王多魚挨著。那能不能安排到指定位置呢?當然可以,我們可以使用班級名.insert(保鏢學號,‘保鏢名字’) 的方式將其添加到指定位置:
第二種情況:指定位置插入元素
>>> one = ['李布爾', '王多魚', '蘇大強', '史曉明']
>>> one.insert(2,'錢大彪')
>>> one
['李布爾', '王多魚', '錢大彪', '蘇大強', '史曉明']
這時候需要注意,因為‘錢大彪’的加入,導致列表內新元素后面元素的相對位置都發生了一次變化。例如 ‘蘇大強’ 過去學號是 2 和 -2,現在學號則變成了3和 -2。
e.刪除:報告老師,我想退學!
因為剛才 ‘錢大彪’ 的加入,導致 ‘蘇大強’ 和 ‘史曉明’ 的學號都滯后一名。在調和失敗后, ‘史曉明’同學憤而退學,老師只好將其從班級名單中刪掉。在python中,將元素從列表中刪除一共有三種方式:
第一種刪除方式:remove 語句
班主任拿出了班級名單,找到了‘史曉明’ 的名字,然后用 班級名.remove(史曉明的姓名) 的方式將 ‘史曉明’ 在班級名單中刪除了:
>>> one = ['李布爾', '王多魚', '錢大彪', '蘇大強', '史曉明']
>>> one.remove('史曉明')
>>> one
['李布爾', '王多魚', '錢大彪', '蘇大強']
第二種刪除方式:del 語句
第一種用remove 語句刪除的情況,前提是老師記得 ‘史曉明’ 的名字。但萬一老師不知道這個學生的名字,或者有熊孩子沒事改名字記不住咋辦?沒事,我們還可以用他的學號刪除(索引刪除),方法為:del 班級名[史曉明學號] 。
>>> one = ['李布爾', '王多魚', '錢大彪', '蘇大強', '史曉明']
>>> del one[4]
>>> one
['李布爾', '王多魚', '錢大彪', '蘇大強']
第三種刪除方式:pop 語句
我們用學號刪除的時候容易出問題,萬一刪錯了咋辦?我咋知道哪個索引到底還是不是 ‘史曉明’ 的學號?。這時候我們可以用pop 語句,同樣也是用索引刪除,但是pop刪除元素后會給你顯示刪除學號對應的名字。具體方法為: 班級名.pop(史曉明的學號)
>>> one = ['李布爾', '王多魚', '錢大彪', '蘇大強', '史曉明']
>>> one.pop(4) '史曉明'
>>> one
['李布爾', '王多魚', '錢大彪', '蘇大強']
我們可以看到執行了班級名.pop(史曉明學號) 后,先給我們返回了一個 ‘史曉明’ 的值,告訴我們剛才刪的是啥。我們在執行一下 one,就會看到班級名單里已經刪除了。
注意:當我們需要刪除列表中的最后一個元素時,可以不寫元素索引。像在剛才的例子中,用 班級名.pop() 即可刪除位于班級名單最后的 ‘史曉明’ 同學:
>>> one = ['李布爾', '王多魚', '錢大彪', '蘇大強', '史曉明']
>>> one.pop() '史曉明'
>>> one
['李布爾', '王多魚', '錢大彪', '蘇大強']
講完班級名.remove()、del 班級名[] 和 班級名.pop() 后,不得不將另一種刪除元素的語句。這種語句與上述三種的不同在于,它會刪除元素內所有元素:
第四種刪除方式:list.clear() 語句
這種方式為清空列表內所有元素,將該列表變為空list:
>>> a = ('1','2','3')
>>> a.clear()
>>> a
[]
這時候如果我們想再確認一遍 ‘史曉明’ 同學到底還在不在班級名單里,可以使用 in 語句,方法為要檢查的同學名字 in 班級名 :
>>> one = ['李布爾','王多魚','錢大彪','蘇大強']
>>> '史曉明' in one
False
返回的結果是 False,就說明史曉明已經不在班級名單中了。同樣我們也可以用要檢查的元素 not in 序列來判斷元素是否不再序列中:
>>> one = ['李布爾','王多魚','錢大彪','蘇大強']
>>> '史曉明' not in one
True
這里要注意的是在要檢查的元素 not in 序列 和 要檢查的元素 in 序列 中,in 后面的既可以是 變量 也可以是 序列本身 ,例如:
# 在變量中檢索
>>> one = ['李布爾','王多魚','錢大彪','蘇大強']
>>> '史曉明' in one
False
# 在序列中檢索
>>> one = ['李布爾','王多魚','錢大彪','蘇大強']
>>> '史曉明' in ['李布爾','王多魚','錢大彪','蘇大強']
False
確定將 ‘史曉明’ 從班級中刪除后,班主任想點一遍名。for in 循環語句終于出場了,用法為 for 標識符 in 序列 。執行語句后,Python會將 列表 中每一個 元素賦值給標識符,賦值結束后繼續循環將第二個元素再重新賦值給標識符,直到將列表中所有數據賦過一遍結束。
>>> one = ['李布爾','王多魚','錢大彪','蘇大強']
>>> for i in one:
print(i)
李布爾 王多魚 錢大彪 蘇大強
在上述代碼中,即將序列 one 中的每一個元素依次賦給標識符 i,即可理解為依次執行:i1 = ‘李布爾’、i2 = ‘王多魚’、i3 = ‘錢大彪’、i4 = ‘蘇大強’,然后print(i) 即依次打印之前的每一次i值,即依次執行print(i1)、print(i2)、print(i3)和 print(i4)。
**f. 更新與替換:王多魚改名了
換名的情況還是發生了:有一天 ‘王多魚’ 的家長聯系老師,請老師更新一下班級名單,因為王多魚剛剛改名了。老師問為啥?他說覺得 ‘王多魚’ 這個名字太世俗了,要取一個有文化的名字: ‘王有才’ 。
老師雖是無奈,也只好作罷。用 班級名[王多魚的學號] = 王多魚的新名字 的方式將班級名單中,王多魚的姓名記錄更新了,從此以后王多魚叫王有才:
>>> one = ['李布爾', '王多魚', '錢大彪', '蘇大強']
>>> one[1] = '王有才'
>>> one
['李布爾', '王有才', '錢大彪', '蘇大強']
**g.合并班級
后來教務處做出一個決定,將1年級3班并入1年級1班。忙碌的班主任又要開始重新合并班級名單,我們先來看一下1年級3班的新同學們:
>>> three = ['楊九年','周媛','錢大彪','鄭仕']
(好像有個哥們重名了??我們一會再說)
班主任這時調用了 extend 語句合并兩個班的學生,方法為 1班名字.extend(3班名字)
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強']
>>> three = ['楊九年','周媛','錢大彪','鄭仕']
>>> one.extend(three)
>>> one
['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕']
還是按照先來后到的道理:extend里新加入列表內的所有元素,都默認添加到了源列表的末尾。
初次之外還可以用 列表直接相加 的方式,例如:
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強']
>>> three = ['楊九年','周媛','錢大彪','鄭仕']
>>> one = one + three
>>> one
['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕']
說到列表之間相互相加,我們再順便談談列表的乘法。一個列表可以直接乘以一個數字,我們可以看看會得到什么樣的結果:
>>> a = ['think','pad']
>>> a * 3
['think', 'pad', 'think', 'pad', 'think', 'pad']
我們發現:將列表乘以一個整數后,Python會將列表內所有元素按順序重復輸出相應的次數。
另外我們發現,1年級1班和1年級3班都有1名叫 ‘錢大彪’ 的同學,但是都不受影響的就放到了同一個列表中。我們可得知:列表中的元素是可重復的。
如果有重復,我們咋知道重復了幾次呢?這時候我們可以用 ‘count’ 語句,用法為 班級名.count(像檢查重復數的對象) :
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕']
>>> one.count('錢大彪')
2
我們就知道,班里現在有兩個 ‘錢大彪’ 的人了,我們可以按照學號次序管他們叫 ‘大錢大彪’ 和 ‘小錢大彪’,我們想查 ‘大錢大彪’ 的學號時,可以用 班級名.index(搜索條件) 的方式檢索第一個匹配搜索的同學的學號(序列):
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕']
>>> one.index('錢大彪')
2
這時候我們就可以快速知道,‘大錢大彪’ 的學號是 2 了。
**h. 排序與嵌套:1年級1班要分組了
為了班級合并后的有序管理,教務處給了1年級1班的班主任一個這樣的任務:要選出一名班長。
班長以外的七名同學分成兩組,每組一名隊長三名隊員。
以學籍號正序為準,前三位分別為:班長、兩名隊員。
將班長名單、隊長名單、隊員名單提交至教務處,收到回復。
第一步:選出學籍號排名第一的同學為班長
一開始我們說每個都學都有自己的學號(索引),但是這容易出現這樣一個問題:
在1年級1班里,學號為 0 的是 ‘李布爾’ 小朋友,但 ‘楊九年’ 小朋友在3年級1班的時候學號也是 0 。為了避免這種重新排序,我們要了解 學籍號 (id)這個概念,每個小朋友都有自己獨一無二id,我們可以用 id(查看id的對象) 這個語句來查看:
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕']
>>> id('蘇大強')
2078505060944
>>> id('周媛')
2078503793656
首先要按照學籍號選出班長來。班主任在這時候調用了 min 語句,使用方法為 min(班級名):
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕']
>>> min(one)
'周媛'
這時,姓名首字母排名最小的 ‘周媛’ 同學成為了班長。
順便一提:我們看到 min 語句自然而然就能想到 max 語句,使用方法為 max() 語句。
max 和 min 語句其實可以設定排序條件的,方法為 min(班級名,key=排序方式) ,比如我們想看看1年級1班中誰名字最短,就可以用 len 即長度來作為判斷標準 min(班級名,key=len) :
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕']
>>> min(one,key=len)
'周媛'
我們會發現在班里 ‘周媛’ 和 ‘鄭仕’ 都是兩個字,但是執行后卻給了我們 ‘周媛’ 的名字,原因是: min 或者 max 語句默認將符合條件的第一個作為結果返回。
第二步:按學籍號排名先后分出隊長和隊員
要分出隊長和隊員,首先我們要知道1年級1班同學們學籍號由小到大的排序吧,班主任用了 sort 語句給班內人排序,使用方法為 班級名.sort() :
>>> one = ['李布爾', '王有才', '錢大彪', '蘇大強', '楊九年', '周媛', '錢大彪', '鄭仕']
>>> one.sort()
>>> one
['周媛', '李布爾', '楊九年', '王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']
現在就一目了然了: 次序第一位的‘周媛’為班長、次序第二、三位的 ‘李布爾’ 、 ‘楊九年’為隊長, 其余五人各為兩組隊員。
注意:在sort() 函數中會默認地按升序排列
說到用 sort() 語句可以將一個列表正向排列,就不得不提到可以將列表倒敘排列的 reverse 語句:
>>> one = ['周媛', '李布爾', '楊九年', '王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']
>>> one.reverse()
>>> one
['錢大彪', '錢大彪', '鄭仕', '蘇大強', '王有才', '楊九年', '李布爾', '周媛']
這時候老師可以創建班長、隊長、隊員的三個名單了:
>>> monitor = ['周媛']
>>> captain = ['李布爾','楊九年' ]
>>> member = [ '王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']
但是這樣分三行顯示好像不太方便,機智的班主任使用了將 monitor 、 captain 和 member 合并給了一個新的班級名單:
>>> monitor = '周媛'
>>> captain = ['李布爾','楊九年' ]
>>> member = [ '王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']
>>> one = [monitor, captain, member]
>>> one
['周媛', ['李布爾', '楊九年'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
班主任完成了1年級1班開學以來的第一個重要任務,心滿意足的給教務處交了差。
通過上述我們可以觀察得知:list(列表)內還可以嵌套其他列表,但其他“列表”被嵌套進來后就已經成為了元素,我們可以檢驗一下:
>>> one = ['周媛', ['李布爾', '楊九年'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
>>> len(one)
3
此時再用 len(班級名) 檢驗發現,one 下只有三個元素。
**i. 復制:教務主任想把這次的名單備個份
教務主任想把這次1年級1班提交的班級名單拷貝一份,留在他的備份 Beifen 里,開始糾結起來了:列表(list)的備份方式有直接賦值 、淺拷貝 和 深拷貝三種,這種情況下用哪種好呢?都試試吧!
**第一種拷貝:直接賦值
一開始教務主任想偷偷懶,直接把1年級1班提交的 one 列表賦值給我的備份文件 Beifen 不就好了 :
>>> one = ['周媛', ['李布爾', '楊九年'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
>>> Beifei = one
>>> Beifei
['周媛', ['李布爾', '楊九年'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
完美!可是直到有一天,教導主任發現他辦公室里的那份 Beifen 文件里,怎么‘楊九天’ 自己變成了 ‘楊浩天’ ?他去問1年級1班的班主任,班主任告訴他:
楊九天改名了,我就把我手里的班級名單改了,怎么,您那兒的列表也變了?
是的,也改變了:
>>> captain[1] = '楊浩天'
>>> one [['周媛'], ['李布爾', '楊浩天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
>>> Beifei
[['周媛'], ['李布爾', '楊浩天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
教務主任想:這不靠譜啊,這樣我辦公室文件就可以讓提交人隨便改了!
于是教導主任只能開始嘗試第二種:
**第二種拷貝:淺拷貝
淺拷貝的使用方式主要有 拷貝到的地方 = 源列表.copy() 、 拷貝到的地方 = 源列表[:] 、 拷貝到的地方 = list(源列表) 效果相同的三種,教導主任就以第一種為例試一下:
>>> Beifei = one.copy()
>>> Beifei
[['周媛'], ['李布爾', '楊九天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
好像看起來又成功了,但教導主任不死心。讓班主任再改一下他手里的班級文件,看看自己這里會不會變:
>>> captain[1] = '楊浩天'
>>> one [['周媛'], ['李布爾', '楊浩天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
>>> Beifei
[['周媛'], ['李布爾', '楊浩天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
還是會變! 教導主任又放棄了第二種拷貝方式,將希望放在了最后一種上:
**第三種拷貝:深拷貝
深拷貝和剛才兩種都不一樣,使用深拷貝前需要先用 import 語句將 copy 調用出來,方法為 import copy。調用后,深拷貝的使用方法為 拷貝到的地方 = copy.deepcopy(源列表):
>>> import copy
>>> Beifei = copy.deepcopy(one)
>>> Beifei
[['周媛'], ['李布爾', '楊九天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
失敗了兩次的教務主任這時候已經不信結果了,執意要班主任再在他那改一次名字:
>>> captain[1]= '楊浩天'
>>> one [['周媛'], ['李布爾', '楊浩天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
>>> Beifei
[['周媛'], ['李布爾', '楊九天'], ['王有才', '蘇大強', '鄭仕', '錢大彪', '錢大彪']]
成功了!這時候我們就明白了:在深拷貝中,當改變原序列中二層以及二層以下的內容時,拷貝后的內容不會受到任何影響。而直接賦值和淺拷貝的方式會受影響。
啥叫二層?
#這叫只有一層:
first = []
#這叫二層,存在列表嵌套:
second = [[],[]]
到這里,我們關于list(列表)的敘述就告一段落。
總結
以上是生活随笔為你收集整理的pythonalist是什么意思_3. Python3轻食丨一个故事看懂List所有用法:1年级1班的班级生活...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python少儿图形编程_少儿Pytho
- 下一篇: 【rviz_plugin Goal3DT