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