13、列表拓展
1.列表的元素
首先,我們來聊聊列表的元素。
雖然你已經(jīng)有所了解,
但還是看看下面這張圖復(fù)習(xí)一下。
在編程里,列表中的數(shù)據(jù)被稱為列表的元素。
以上面例子來看,列表 skills 中有兩個(gè)元素,
分別是 '英語六級' 和 '吉他',
且這兩個(gè)元素都是字符串。
列表是一個(gè)包容的數(shù)據(jù)類型.
其中的元素可以為任意數(shù)據(jù)類型,
包括整數(shù)、浮點(diǎn)數(shù)、字符串,列表,
以及后續(xù)我們會學(xué)到的元組,字典等。
舉個(gè)例子,我們以 bag 來代表知楓的書包,
pen_bag 來代表書包內(nèi)的筆袋。
我們先閱讀一段代碼。
在這串代碼里面,我創(chuàng)建了兩個(gè)列表,
分別為:bag 和 pen_bag。
其中在列表 bag 里面,一共有三個(gè)元素,
包括兩個(gè)字符串:'電腦','雨傘';
以及一個(gè)我們創(chuàng)建的列表 pen_bag。
我們打印一下列表 bag 看看。
此時(shí)你可以看到終端顯示為:
['電腦', '雨傘', ['筆', '尺子', '涂改液']] 這個(gè)結(jié)果。
也就是說,列表中的列表,同樣是一個(gè)元素。
這就好比知楓的書包里可以放電腦外,
還可以再放一個(gè)小包裝筆尺。
列表元素可以是任何數(shù)據(jù)類型。
它不止像上面這個(gè)例子那樣,
可以是一個(gè)列表,
它還可以是我們后面會學(xué)到的字典和元組。
總之,無論是什么數(shù)據(jù)類型,
我們都可以把它看成一個(gè)元素。
打印出來的兩個(gè)結(jié)果是兩個(gè)一樣的列表。
這是因?yàn)閯?chuàng)建列表時(shí),直接將數(shù)據(jù)寫在里面,
和使用變量來代替的效果是一樣的。
2 索引取值
列表中的每個(gè)元素都有其對應(yīng)位置的數(shù)字編號,即索引。
只要在列表后面加一個(gè)中括號 [],
Python 里從 0 開始計(jì)數(shù),
所以 '吉他' 的索引是 1,
'英文六級'的索引是 0。
例如:list[n] 它表示的是:
從左往右數(shù),第 n+1 個(gè)元素。
除此之外,Python 還支持用負(fù)數(shù)做索引,
比如 list[-n] 它表示的是:
從右往左數(shù),第 n 個(gè)元素。
所以如果你想提取列表 skills 中的 '吉他',
你還可以寫成:skills[-1]。
用負(fù)數(shù)做索引這種用法會使用在你不知道列表有多長,
但你就是想拿到最后倒數(shù)第 n 個(gè)元素的時(shí)候。
【代碼練習(xí)】把小包 bag 中的'筆'拿出來。
第一步我們先要從書包 bag 把小包 pen_bag 拿出來。
第二步我們需要把小包 bag 中的'筆'拿出來。
這個(gè)過程,很像剝洋蔥,
一層一層地去把列表打開,拿到我們想要的東西。
總結(jié)一下,當(dāng)需要兩次索引的時(shí)候,
在 Python 上的格式為:list[索引][索引]。
3.3 列表的切片
索引 [a:b] 的切取范圍是:a <= X < b
要從列表里取多個(gè)元素怎么辦?
此時(shí),我們會用到一種新的技巧:切片 。
切片即在列表中切取一段數(shù)據(jù),
生成一個(gè)新的列表。
在切片時(shí),索引 [a:b] 的切取范圍是:
a <= X < b,
左邊有等于號,而右邊是沒有等于號的。
對照著看上面的圖片,
給列表中的每個(gè)元素前面都加上它的索引。
切片,就是取出兩個(gè)索引中間夾著的元素。
口訣:“列表切片怎么用,記好取左不取右”。
冒號左右的值可以不填,
不填的時(shí)候則代表一取到底。
3.4 添加列表的元素
append :添加的意思。
用法格式是:列表名.append(元素)。
通過 append() 添加元素,
元素會被添加到列表的最后一個(gè)位置。
3.5 列表的修改
修改列表內(nèi)的元素時(shí),直接重新賦值就好了。
賦值的方法是:列表名[索引] = 新內(nèi)容
- 元組
元組(tuple),是一種數(shù)據(jù)類型。
與列表在形式上有一個(gè)區(qū)別:
列表用中括號[],而元組是用小括號()。
元組可以存儲大量數(shù)據(jù),
和列表一樣都可以用同樣的方式取值,
都可以用同樣的方式切片等。
元組和列表最大的不同之處在于:
元組,一經(jīng)創(chuàng)建則不可修改。
如果元組里只有一個(gè)元素,后面也要加逗號,如 foods = ('龜苓膏',),
如果不加逗號的話,
那它就不會被判定成元組。
- 序列
- 序列的概念
列表和元組都是由按順序排列的數(shù)據(jù)組成的。
在 Python 中,把像列表和元組這樣的數(shù)據(jù)類型,都叫做序列。
序列:就是一組多個(gè)數(shù)據(jù)按順序排成一列。
序列內(nèi)有一個(gè)個(gè)元素,
每個(gè)元素都有對應(yīng)的索引,
用于標(biāo)記元素的位置。
還有一類序列,字!符!串!
字符串本質(zhì)上也可以理解成,
一個(gè)個(gè)字符按照一定的順序排列起來的串兒。
引號內(nèi)每一個(gè)字符都按著一定的順序排列,
并且每個(gè)字符也是有對應(yīng)的索引的。
所以它叫字符串,完美符合序列的定義。
作為序列,
它們都有元素以及元素所對應(yīng)的索引,
并都可以進(jìn)行索引取值、切片、等操作。
- 成員運(yùn)算符
序列可以進(jìn)行某個(gè)元素是否在序列內(nèi)的判斷。
以 skills = ['英語六級', '吉他'] 舉個(gè)例子。
假如我們想要判斷一項(xiàng)能力(元素)是否還在我掌握的技能(skills 列表)里,該怎么做呢?
Python 里有成員運(yùn)算符 in,
可以判斷一個(gè)元素是否在某一個(gè)序列中。
結(jié)合 if 來判斷某個(gè)元素是否在序列內(nèi)時(shí),
常見寫法是:if 元素 in 序列,
可以理解為如果某個(gè)元素在列表內(nèi),
就執(zhí)行一些代碼。
拓展一個(gè)知識點(diǎn),
如果想要判斷一個(gè)元素是否不存在列表呢,
可以用:if 元素 not in 序列 來判斷。
17、序列拓展:len count list
- 課前說明
之前學(xué)習(xí)了列表、元組、字符串這類序列,
本次課程學(xué)習(xí) 3 個(gè)序列的應(yīng)用方法。
不妨想象一下,你即將擔(dān)任將軍,
前任將軍,給你留了一支部隊(duì),
部隊(duì)的變量名為 army,用 python 如下圖表示:
army =('炮兵', '步兵', '步兵', '步兵', '醫(yī)療兵', '步兵', '步兵', '炮兵', '步兵', '步兵', '醫(yī)療兵', '步兵', '步兵', '炮兵', '步兵', '步兵', '醫(yī)療兵', '步兵', '步兵')
部隊(duì)的數(shù)據(jù)類型是元組,士兵相當(dāng)于元組里的元素。
新官上任,第一步要做的就是清點(diǎn)部隊(duì)一共有多少人,
方便后續(xù)對部隊(duì)重新整編。
如何清點(diǎn)呢?
這里有一個(gè)函數(shù):len(),剛好能夠幫助到你。
- len()
len 是 length 的縮寫,中文是長度的意思。
對于列表和元組這類序列來說,
所謂長度是指元素的個(gè)數(shù)。
將列表、元組、字符串等數(shù)據(jù)類型傳入到 len() 中,
其長度將以整數(shù)形式返回。
打印出返回的結(jié)果是 3 ,
說明該元組的長度為 3 ,
即有 3 個(gè)元素。
嘗試用 len() 來清點(diǎn)一下你的部隊(duì)一共有多少人吧。
你在終端看到返回結(jié)果為 19 ,
代表部隊(duì)中一共有 19 名士兵。
- count()
count 在英文里是計(jì)算的意思。
序列.count(元素)。
一支部隊(duì)里還有各類兵種,他們?nèi)藬?shù)不一。
我們還需要清算部隊(duì)各兵種的數(shù)量。
count()用于統(tǒng)計(jì)序列(包括:列表、元組等)中某個(gè)元素出現(xiàn)的次數(shù)。
count()會以整數(shù)的數(shù)據(jù)類型返回該元素在序列內(nèi)的個(gè)數(shù)。
用count()統(tǒng)計(jì)混在兔中的免的個(gè)數(shù)。
如終端所示,一共有 3 個(gè)免。
類比到你的部隊(duì),count()就是相當(dāng)于要士兵報(bào)數(shù)。
若傳入?yún)?shù)'炮兵'到count()中,那么就返回'炮兵'的個(gè)數(shù)。
需要注意的是:len()、count()返回的數(shù)據(jù)類型是整數(shù),
所以要用 str() 轉(zhuǎn)化為字符串后才可以與字符串作拼接。
- list()
List:中文的意思是列表。
為什么將部隊(duì)設(shè)置元組,而不是列表呢?
之所以將各個(gè)部隊(duì)都設(shè)置為元組而非列表,
是為了防止人員(元組 army 內(nèi)的元素)隨意變動。
現(xiàn)在想加強(qiáng)軍隊(duì)訓(xùn)練,需要添加一位教官來管理。
注意,元組沒法對內(nèi)部的元素做修改、增加等操作,
這時(shí)候就需要用 list() 做數(shù)據(jù)轉(zhuǎn)換啦。
list 在英文中就是列表的意思,
將需要轉(zhuǎn)換的數(shù)據(jù)類型作為參數(shù)輸入list()中,
就可以把它轉(zhuǎn)換為對應(yīng)的數(shù)據(jù)類型。
我們來看一個(gè)將元組轉(zhuǎn)換為列表的例子,
打印結(jié)果顯示元組('a', 'b', 'c')的小括號變成['a', 'b', 'c']的中括號了,
說明它已經(jīng)成功將元組轉(zhuǎn)換成列表的形式進(jìn)行輸出。
需要注意的是,list() 只是將元組轉(zhuǎn)換成列表的形式,
元組的本身并不會發(fā)生改變。
將元組 army 轉(zhuǎn)換為列表后,添加一個(gè)新的元素 '教官'。
- 總結(jié)歸納
18、列表元組課后練習(xí)
【牛刀小試】
選擇題 1 - 序列 & 數(shù)據(jù)類型
字符串是序列的一種,而且屬于不可變數(shù)據(jù)類型。
多選題:根據(jù)以上信息,請你選出正確的選項(xiàng):
A. 字符串不可以進(jìn)行切片
B. 字符串可以增加元素,但是不能刪除元素
C. 字符串內(nèi)每一個(gè)字符都是按著一定的順序排列的
D. 字符串一經(jīng)創(chuàng)建之后,就不能修改
答案:CD
A序列都可以進(jìn)行索引取值和切片,字符串是序列的一種,因此可以進(jìn)行切片。
B 不可變數(shù)據(jù)類型一經(jīng)創(chuàng)建就不可修改,字符串屬于不可變數(shù)據(jù)類型,因此既不能增加元素,也不能刪除元素。
選擇題 2 - 索引 & 切片
閱讀下面這兩行代碼,并結(jié)合你對列表和元組的理解,完成選擇題。
num_list = [1, 3, 5, 7, 9, 11, 13]
num_tuple = (1, 3, 5, 7, 9, 11, 13)
單選題:觀察選項(xiàng)中的代碼,選出正確的一項(xiàng):
A. num_list[-2] 的結(jié)果是:[11]
B. num_list[2:3] 的結(jié)果是:[5, 7]
C. num_tuple[4] 的結(jié)果是:(9,)
D. num_tuple[5:6] 的結(jié)果是:(11,)
答案是D
A num_list[-2] 表示列表的負(fù)向索引,只能取到數(shù)值,而不是選項(xiàng)中的列表。
B num_list[2:3] 表示列表的切片,按照“取左不取右”的原則,只能取到從左到右第 2+1 個(gè)元素組成的列表 [5],而非選項(xiàng)中的 [5, 7]。
C num_tuple[4] 表示元組的索引,同樣只能取到數(shù)值,而不是選項(xiàng)中的元組 (9,)。
D num_tuple[5:6] 表示元組的切片,可以取到從左到右第 5+1 個(gè)元素組成的元組,即 (11,)。
運(yùn)行代碼驗(yàn)證:
選擇題 3 - 成員運(yùn)算符
單選題:請你選出結(jié)果為 True 的選項(xiàng):
A. print(4 in [1, 2, 3, [4, 5, 6]])
B. print(4 in [4, 5, 6])
C. print(4 in [[4, 5, 6]])
答案是 B
觀察三個(gè)選項(xiàng),可以看到其中的代碼功能是判斷整數(shù) 4 是否在某個(gè)列表中。
如果在,輸出結(jié)果為真;否則,輸出結(jié)果為假。
A 選項(xiàng)中,[1, 2, 3, [4, 5, 6]] 是一個(gè)嵌套列表,它有四個(gè)元素,分別是 1,2,3 以及 [4, 5, 6]。
4 并非其中任何一個(gè)元素,因此不在該嵌套列表中,輸出結(jié)果為 False。
B 選項(xiàng)中,[4, 5, 6] 是一個(gè)普通的列表,它有三個(gè)元素,分別是 4,5,6。
整數(shù) 4 在該列表中,因此輸出結(jié)果為 True。
C 選項(xiàng)中,[[4, 5, 6]] 是一個(gè)嵌套列表,僅有一個(gè)元素 [4, 5, 6]。
因此,整數(shù) 4 不在該嵌套列表中,輸出結(jié)果為 False。
運(yùn)行代碼驗(yàn)證一下吧:
選擇題 4 - 成員運(yùn)算符
小強(qiáng)下班坐公交回家,他的選擇有三種,
分別是 301、209、355 路公交。
為了讓他能夠準(zhǔn)確地坐上公交回家,需要補(bǔ)全下面的代碼塊:
choice = ['301', '209', '355']
bus = input('來了一輛公交,號碼是:')
[條件判斷語句]
print('坐這輛公交回家')
多選題:請你選出合理的條件判斷語句:
A. if bus in choice:
B. if bus == choice:
C. if bus == '301' or bus == '209' or bus == '355':
D. if bus == '301' and bus == '209' and bus == '355':
答案是 A、C
簡單理解一下題意:我們要判斷“來了一輛公交,這輛公交的號碼”是否在列表 ['301', '209', '355'] 中。
很明顯借助成員運(yùn)算符 in 就可以實(shí)現(xiàn),所以我們先把 A 選上。再來看選項(xiàng) B、C、D。
B 選項(xiàng)中,if bus == choice: 成立的前提是同時(shí)看到是三輛公交車,與我們獲取的輸入值(一輛公交)相悖,所以直接舍棄。
C 選項(xiàng)中,if bus == '301' or bus == '209' or bus == '355': 表示來的公交車可以是 301 或者 209 或者 355,只要是其中任何一個(gè),條件都可以成立。這個(gè)條件符合我們的需求。
D 選項(xiàng)和 B 選項(xiàng)實(shí)現(xiàn)的功能相同,直接舍棄。
代碼題 5 - 索引 & 列表的修改
“貍貓換太子”:請你按照下面的注釋補(bǔ)充代碼。
我的答案:
皇家嬰兒名單是一個(gè)嵌套列表,該嵌套列表中的第 3 個(gè)元素['三公主', '太子']中的第 2 個(gè)元素就是'太子',因此,使用 baby_list[2][1] 即可“找到太子”。
“找到太子”后,使用相同的索引可將元素'太子'換成元素'貍貓'”,實(shí)現(xiàn)該列表元素的修改,即 baby_list[2][1] = '貍貓'
實(shí)戰(zhàn) 1 - 成員運(yùn)算符 & 列表
智能簽到系統(tǒng)
【練習(xí)介紹【】】
簽到,對于我們來說再平常不過了。無論上班打卡,亦或參加某項(xiàng)活動,都少不了簽到這一環(huán)節(jié)。常見的有人臉識別、指紋識別、填寫姓名等簽到方式。在這里,我們就以填寫姓名這種方式為依據(jù),設(shè)計(jì)一個(gè)簡易的智能簽到系統(tǒng),避免重復(fù)簽到。
【題目要求】
通過自主輸入姓名,判斷是否簽到。如果已經(jīng)簽到,提示用戶無需重復(fù)簽到;否則,提供是否簽到選項(xiàng)。
詳細(xì)的邏輯可以參考下方代碼塊:
輸入姓名
如果已經(jīng)簽到,打印"您已經(jīng)簽到,無需重復(fù)簽到單"
否則,詢問"是否新增簽到"
回答"是",則將姓名添加到簽到表,并打印"簽到成功以及簽到名單"
回答"否",則打印"您可以稍后簽到"
給你一點(diǎn)點(diǎn)提示:
1)變量名建議:姓名 —— name;簽到名單 —— attendance_list;回答 —— answer。
我的答案:
實(shí)戰(zhàn) 2 - 索引
設(shè)計(jì)搖獎機(jī)
【練習(xí)介紹】
不知道你有沒有玩過搖獎機(jī),只要搖動搖桿,屏幕中間的三個(gè)圖案輪就會飛快轉(zhuǎn)動。當(dāng)圖案輪旋轉(zhuǎn)停止,顯示的三個(gè)圖案如果相同,即為中獎。
在這里,我們做一個(gè)簡易的搖獎機(jī)。
可以把列表當(dāng)做“數(shù)字轉(zhuǎn)盤”,為了降低操作難度,我已經(jīng)為你提供了三個(gè)列表。
num_list1 = ['0', '1', '0', '1', '1', '0', '1', '0', '1', '0']
num_list2 = ['0', '1', '1', '1', '0', '0', '1', '0', '0', '1']
num_list3 = ['1', '0', '1', '1', '0', '1', '1', '0', '1', '1']
每個(gè)列表包含 10 個(gè)亂序的數(shù)字字符串,只有 '0' 和 '1'兩種。
然后,把“輸入一個(gè)三位數(shù)”當(dāng)成“搖獎”這個(gè)動作,并把這個(gè)三位數(shù)的百位數(shù)、十位數(shù)、個(gè)位數(shù)作為索引,分別對列表取值,組成兌獎碼。
以 223 這個(gè)三位數(shù)為例,對三個(gè)列表分別索引取值,組成的兌獎碼是 011。
【題目要求】
隨機(jī)輸入一個(gè)三位數(shù)(000 - 999),可以獲得一個(gè)專屬的兌獎碼,當(dāng)兌獎碼為 111 或 000 時(shí),即為中獎,否則,未中獎。
給你一點(diǎn)點(diǎn)提示:
1)變量名建議:輸入的三位數(shù) —— num,三位數(shù)中的百位數(shù) —— hundreds_digit,三位數(shù)中的十位數(shù) —— tens_digit,三位數(shù)中的個(gè)位數(shù) —— ones_digit,兌換碼 —— code。
我的答案:
Input 輸入的是字符串,需要用int轉(zhuǎn)換為整數(shù)
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7233瀏覽量
90748 -
編程
+關(guān)注
關(guān)注
88文章
3673瀏覽量
94694 -
元素
+關(guān)注
關(guān)注
0文章
47瀏覽量
8561
發(fā)布評論請先 登錄
相關(guān)推薦
Python的列表和元組兩種數(shù)據(jù)結(jié)構(gòu)區(qū)別差異分析












評論