高級列表操作

成員運(yùn)算符 in

我們用來判斷一個(gè)元素是否在一個(gè)列表中,格式為 "元素 in 列表"。這是一個(gè)布爾表達(dá)式,如果元素在列表中,結(jié)果為布爾值 True,反之為 False。

students = [ '林黛玉','薛寶釵','賈元春','妙玉', '賈惜春',  '王熙鳳',  '秦可卿', '賈寶玉']

miaoyu_in = '妙玉' in students
print(miaoyu_in)
# 輸出:True
xiangyun_in = '史湘云' in students
print(xiangyun_in)
# 輸出:False

元素 in 列表 既然是一個(gè)布爾表達(dá)式,我們就可以結(jié)合 if ... else 語句實(shí)現(xiàn)很多功能:

if '史湘云' in students:
  print('請史湘云背誦課文')
else:
  print('喊其他同學(xué)背誦吧')
# 輸出:喊其他同學(xué)背誦吧

列表的加法

數(shù)字之間的加法是我們最熟悉不過的運(yùn)算了,列表的加法也很簡單,就是用 + 號將兩個(gè)列表的元素放在一起組成一個(gè)新列表。

# 列表的加法
students = ['林黛玉', '薛寶釵', '賈元春', '賈探春', '史湘云', '妙玉', '賈迎春', '賈惜春', '王熙鳳', '賈璉', '賈巧姐', '李紈', '秦可卿', '賈寶玉']
parents = ['賈敬', '賈政', '王夫人', '賈赦', '邢夫人']
meeting = students + parents
# 打印 meeting 的結(jié)果,以及最終人數(shù)
print(meeting)
print('與會人數(shù)為', len(meeting), '人')
# 輸出:
# ['林黛玉', '薛寶釵', '賈元春', '賈探春', '史湘云', '妙玉', '賈迎春', '賈惜春', '王熙鳳', '賈璉', '賈巧姐', '李紈', '秦可卿', '賈寶玉', '賈敬', '賈政', '王夫人', '賈赦', '邢夫人']
# 與會人數(shù)為 19 人

這樣我們就用加法生成了一個(gè)完整的與會名單。要注意用加法生成的列表的元素順序,在 + 號前的列表元素排在新列表的前面,在 + 后的列表元素在新列表的后面。

列表的乘法

列表的乘法, 用 列表 * n,我們可以生成一個(gè)元素?cái)?shù)目為原列表 n 倍的新列表。

lag_behind = ['賈探春', '秦可卿', '賈惜春', '賈璉']

# 用乘法快速生成輪班表
recite_list = lag_behind * 5

print(recite_list)
# 輸出:['賈探春', '秦可卿', '賈惜春', '賈璉', '賈探春', '秦可卿', '賈惜春', '賈璉', '賈探春', '秦可卿', '賈惜春', '賈璉', '賈探春', '秦可卿', '賈惜春', '賈璉', '賈探春', '秦可卿', '賈惜春', '賈璉']

看完上面代碼的運(yùn)行結(jié)果,我們發(fā)現(xiàn),列表的乘法的定義,和數(shù)字的乘法很像:1 * 3 實(shí)際上是 1 + 1 + 1 的簡寫,那么 列表 * 3 就是 列表 + 列表 + 列表 的簡寫啦。

元組

元組和列表非常相似。不同之處在于,外觀上:列表是被方括號包裹起來的,而元組是被 圓括號 包裹起來的。本質(zhì)上:列表里的元素可修改,元組里的元素是 不可以“增刪改” 的。

  • 還有一個(gè)微妙的地方要注意,就是只有一個(gè)元素的元組,在格式上與列表是不同的。僅一個(gè)元素 x 的列表寫成 [x], 但僅一個(gè)元素的元組要在括號內(nèi)多寫個(gè)逗號:(x,)。
    這是因?yàn)?Python 中,圓括號承擔(dān)的語法功能太多了,可以用來表示元組,也可以用于當(dāng)數(shù)學(xué)運(yùn)算中的小括號。(x) 這樣的寫法,Python 會優(yōu)先理解成數(shù)學(xué)運(yùn)算的小括號,所以光禿禿的 (x) 對 Python 來說就是一個(gè)套了個(gè)小括號的數(shù)學(xué)運(yùn)算表達(dá)式。

有了元組這種相對穩(wěn)定的數(shù)據(jù)結(jié)構(gòu),我們就再也不怕手滑把數(shù)據(jù)改掉啦!
如果真的非要去改元組內(nèi)部的數(shù)據(jù),將會報(bào)錯的哦:

students = ('林黛玉', '賈寶玉', '薛寶釵')
students.append('史湘云')
# 報(bào)錯:AttributeError: 'tuple' object has no attribute 'append'
# (屬性錯誤:元組對象沒有 append 屬性)
# 補(bǔ)充說明:關(guān)于“對象”“屬性”,我們在后面的課程會說

students[2] = '襲人'
# 報(bào)錯:TypeError: 'tuple' object does not support item assignment
#(類型錯誤:元組對象不支持給其中元素賦值)
del students[1]
# 報(bào)錯:TypeError: 'tuple' object doesn't support item deletion
# (類型錯誤:元組對象不支持刪除操作)

除了上述例子外,其它的用于增加、修改或刪除語句和方法都不能用在元組上

但是,由于查詢與分片操作并不會改變數(shù)據(jù),所以我們說的兩種列表元素的查詢方式以及分片操作,在元組中是可用的。

students = ('林黛玉', '賈寶玉', '薛寶釵')

print(students[1])
# 輸出:賈寶玉
print(students.index('賈寶玉'))
# 輸出:1
print(students[:2])
# 輸出:('林黛玉', '賈寶玉')

另外,上一節(jié)所說的列表運(yùn)算符,元組也都支持。用 in 查詢元素是否在元組內(nèi);用 + 將兩個(gè)元組疊加生成新元組;用 * 生成元素重復(fù)循環(huán)多次的新元組。
下面,我們總結(jié)一下元組支持的操作吧:



如果真的有特殊需求,需要修改元組中的元素,可以先用 list() 函數(shù)把元組轉(zhuǎn)換成列表,相當(dāng)于給數(shù)據(jù)“解鎖”,將元素修改完畢后,再用 tuple() 函數(shù)轉(zhuǎn)換回元組,相當(dāng)于“重新上鎖”。
我們在下面的代碼中來看看具體的操作步驟:

students = ('林黛玉', '賈寶玉', '薛寶釵')

# 用 list() 函數(shù)給數(shù)據(jù)“解鎖”,生成一個(gè)相同元素的新列表
students_list = list(students)
# 在新列表中修改元素
students_list[0] = '妙玉'
# 兩次給數(shù)據(jù)“上鎖”
students = tuple(students_list)
print(students)
# 輸出:('妙玉', '賈寶玉', '薛寶釵')

zip() 函數(shù)

zip() 函數(shù)的作用是將兩個(gè)長度相同的列表合并起來,相同位置的元素會被一一組對,變成一個(gè)元組。結(jié)果返回一個(gè)組合好的打包對象,需要我們再用 list() 函數(shù)轉(zhuǎn)換回列表。

midterm_rank = [
  '妙玉',
  '薛寶釵',
  '賈元春',
  '王熙鳳',
  '林黛玉',
  '賈巧姐',
  '史湘云',
  '賈迎春',
  '賈寶玉',
  '李紈',
  '賈探春',
  '秦可卿',
  '賈惜春',
  '賈璉']
scores = [100, 92, 77, 85, 81, 90, 100, 86, 79, 93, 91, 96, 75, 84]
# 將 scores 元素從低到高排列
scores.sort()
# 倒轉(zhuǎn) scores 中的排列順序
scores.reverse()
print(scores)
# 輸出:[100, 100, 96, 93, 92, 91, 90, 86, 85, 84, 81, 79, 77, 75]


# 用 zip() 將兩個(gè)列表合并
zipped = zip(midterm_rank, scores)
# 將結(jié)果轉(zhuǎn)換回列表后,賦值給 zipped_rank
zipped_rank = list(zipped)
# 來看看結(jié)果
print(zipped_rank)
# 輸出:[('妙玉', 100), ('薛寶釵', 100), ('賈元春', 96), ('王熙鳳', 93), ('林黛玉', 92), ('賈巧姐', 91), ('史湘云', 90), ('賈迎春', 86), ('賈寶玉', 85), ('李紈', 84), ('賈探春', 81), ('秦可卿', 79), ('賈惜春', 77), ('賈璉', 75)]

enumerate() 函數(shù)

“enumerate”單詞本身意思是“枚舉、數(shù)數(shù)”。所以對應(yīng)的函數(shù)功能,就是一個(gè)一個(gè)地將列表中的元素?cái)?shù)出來。它返回的是一個(gè)枚舉對象,也需要我們用 list() 函數(shù)轉(zhuǎn)換回列表。
有了這個(gè)函數(shù),我們就可以把原來的排名表 midterm_rank 中,每個(gè)同學(xué)的具體排名都顯示出來了。
但是要注意:機(jī)器還是會從 0 開始數(shù)……

# 枚舉原排名表后,再轉(zhuǎn)回列表的形式
rank_with_id = list(enumerate(midterm_rank))

print(rank_with_id)
# 輸出:[(0, '妙玉'), (1, '薛寶釵'), (2, '賈元春'), (3, '王熙鳳'), (4, '林黛玉'), (5, '賈巧姐'), (6, '史湘云'), (7, '賈迎春'), (8, '賈寶玉'), (9, '李紈'), (10, '賈探春'), (11, '秦可卿'), (12, '賈惜春'), (13, '賈璉')]

我們看到,最后的結(jié)果是與 zip() 處理結(jié)果相似的嵌套結(jié)構(gòu),列表中每個(gè)元素是一個(gè)元組,元組中是排名和姓名。

畢竟結(jié)果是要在現(xiàn)實(shí)世界中使用的,從 0 開始數(shù)的排名實(shí)在不太符合我們實(shí)際使用的要求。好在 enumerate() 函數(shù)中有個(gè)默認(rèn)參數(shù)表示起始數(shù)字,默認(rèn)為 0,所以機(jī)器才會從 0 開始數(shù)。我們可以手動輸入起始數(shù)字 1,讓結(jié)果更符合我們的習(xí)慣。

# enumerate()中這次有兩個(gè)參數(shù),一個(gè)為排名列表,一個(gè)為起始數(shù)字。
rank_with_ID = list(enumerate(midterm_rank, 1))

print(rank_with_ID)
# 輸出:[(1, '妙玉'), (2, '薛寶釵'), (3, '賈元春'), (4, '王熙鳳'), (5, '林黛玉'), (6, '賈巧姐'), (7, '史湘云'), (8, '賈迎春'), (9, '賈寶玉'), (10, '李紈'), (11, '賈探春'), (12, '秦可卿'), (13, '賈惜春'), (14, '賈璉')]

range() 函數(shù)

range() 函數(shù)快速生成一個(gè)有規(guī)律的數(shù)字序列。該函數(shù)的基本格式為 range(start, stop, step),返回一個(gè) range 對象,要用 list() 函數(shù)轉(zhuǎn)換成列表。



range() 函數(shù)最多支持 3 個(gè)參數(shù),start 參數(shù)是起始元素,stop 參數(shù)是結(jié)束元素,step 是步長,也就是計(jì)數(shù)的間隔。其中 start 和 step 是可選的,分別默認(rèn)為 0 和 1,比如 list(range(3)) 可以快速生成 [0, 1, 2] 列表。如下:

# 起始為 1, 結(jié)束為 36502(36501向后一位),步長默認(rèn)為 1
stones = list(range(1, 36502))

# 列表太長,我們不打印內(nèi)容了,直接打印列表長度、第一個(gè)元素和最后一個(gè)元素。
print('共有' + str(len(stones)) + '個(gè)元素')
print('第一個(gè)元素是' + str(stones[0]))
print('最后一個(gè)元素是' + str(stones[-1]))
# 輸出:
# 共有36501個(gè)元素
# 第一個(gè)元素是1
# 最后一個(gè)元素是36501

總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容