一個list是可變的項目集合,各項目依_序列_排列。
就像大多數的集合類型(請參見內建的tuple、dict和set),list可以儲存任何(或多種)資料型態的參照,包括其他的list。
陣列可以透過切片語法或使用<list>.copy()整份或部分複製。
就像任何序列一樣,lists中的元素可以從左邊以0-based index編號、或從右邊以-1-based index編號來引用。
陣列同時支援一般與可變的序列操作,例如min(<list>)/max(<list>)、<list>.index()、<list>.append()和<list>.reverse()。
list中的元素可以使用for item in <list>這樣的構造來疊代。
當同時需要元素的索引和值時,可以使用for index, item in enumerate(<list>)。
Python 也提供了許多實用的list-methods來操作陣列。
以下會介紹其中一些list methods。
請注意,當你用list-method操作list時,你會改動這個陣列物件。
如果你不想改動原始的list,至少需要透過切片或<list>.copy()做一份shallow copy。
如果要把項目加到現有陣列的最後或「右側」,請使用<list>.append(<item>):
>>> numbers = [1, 2, 3]
>>> numbers.append(9)
>>> numbers
[1, 2, 3, 9]
有別於_附加_,<list>.insert()讓你可以把項目加到陣列中_指定的索引_位置。
它接受 2 個參數:
<index>。<item>。注意:如果給定的index是 0,項目會被加到list的開頭(「左側」)。
如果提供的index大於list上最後一個index,項目會被加到最後的位置,等同於使用<list>.append(<item>)。
>>> numbers = [1, 2, 3]
>>> numbers.insert(0, -2)
>>> numbers
[-2, 1, 2, 3]
>>> numbers.insert(1, 0)
>>> numbers
[-2, 0, 1, 2, 3]
<list>.extend(<item>)可以用來把現有陣列與另一個可疊代物件(例如set、tuple、str或list)的元素合併。
這個可疊代物件會被_拆解_,元素會依序附加(在這種情況下使用<list>.append(<item>)會把整個可疊代物件當成單一項目加入。)。
>>> numbers = [1, 2, 3]
>>> other_numbers = [5, 6, 7]
>>> numbers.extend(other_numbers)
>>> numbers
[1, 2, 3, 5, 6, 7]
>>> numbers.extend([8, 9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9]
>>> numbers.append([8,9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9, [8, 9]]
如果要從陣列中刪除項目,請使用<list>.remove(<item>),並將要移除的項目作為引數傳入。
如果該項目不在list中,<list>.remove(<item>)會拋出ValueError。
>>> numbers = [1, 2, 3]
>>> numbers.remove(2)
>>> numbers
[1, 3]
# Trying to remove a value that is not in the list throws a ValueError
>>> numbers.remove(0)
ValueError: list.remove(x): x not in list
或者,使用<list>.pop(<index>)方法可以同時移除並return一個元素供你使用。
<list>.pop(<index>)接受一個選用參數:要移除並回傳的項目index。
如果沒有指定(選用的)index引數,list的最後一個元素會被移除並回傳。
如果指定的index大於最後一個項目的index,就會引發IndexError。
>>> numbers = [1, 2, 3]
>>> numbers.pop(0)
1
>>> numbers
[2, 3]
>>> numbers.pop()
3
>>> numbers
[2]
>>> numbers.pop(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
用list.clear()可以移除list中的所有元素。它不接受任何參數。
>>> numbers = [1, 2, 3]
>>> numbers.clear()
>>> numbers
[]
<list>.reverse()方法會就地反轉元素的順序。
>>> numbers = [1, 2, 3]
>>> numbers.reverse()
>>> numbers
[3, 2, 1]
陣列可以透過<list>.sort()_就地重新排序。
預設的排序順序是由左至右_遞增。
Python 文件提供了更多排序的技巧與方法。
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
# The default sort order is *ascending*.
>>> names.sort()
>>> names
["Bruce", "Natasha", "Thor", "Tony"]
如果想要_遞減_的順序,請傳入reverse=True引數:
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> names.sort(reverse=True)
>>> names
["Tony", "Thor", "Natasha", "Bruce"]
如果不希望改動原始陣列,可以使用內建的sorted(<iterable>)函式回傳排序後的副本。
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> sorted(names)
['Bruce', 'Natasha', 'Thor', 'Tony']
元素在陣列中出現的次數可以用list.count(<item>)計算。
它接受要計數的item作為引數,並回傳該元素在list中出現的總次數。
>>> items = [1, 4, 7, 8, 2, 9, 2, 1, 1, 0, 4, 3]
>>> items.count(1)
3
<list>.index(<item>)會回傳傳入項目_第一次出現_的index編號。
如果都沒有出現,就會引發ValueError。
如果不需要項目的確切位置,內建的in運算子更適合用來檢查陣列是否包含某個值。
索引從左側開始由零算起,所以「第一個」項目的位置是0。
索引也可以從右側開始,以-1起算。
>>> items = [7, 4, 1, 0, 2, 5]
>>> items.index(4)
1
>>> items.index(10)
ValueError: 10 is not in list
也可以提供start和end索引,把搜尋範圍縮小到list的特定區段:
>>> names = ["Tina", "Leo", "Thomas", "Tina", "Emily", "Justin"]
>>> names.index("Tina")
0
>>> names.index("Tina", 2, 5)
3
Chaitana 擁有一座非常受歡迎的主題樂園。 在景觀優美的園區正中央,她只有一項遊樂設施:世界上最大的雲霄飛車(TM)。 雖然只有這一項設施,世界各地的人們仍特地前來,排上好幾個小時的隊,只為了有機會搭乘 Chaitana 的超級雲霄飛車。
這項設施有兩條隊伍,各自用一個 list 表示:
你受託撰寫一些程式碼,好更妥善地管理樂園裡的遊客。 你必須盡快實作以下函式,免得遊客(還有你的老闆 Chaitana!)開始不高興。 請務必仔細閱讀。 有些任務要求你變更或更新現有的隊伍,有些則要求你複製一份。
定義 add_me_to_the_queue() 函式,它接受 4 個參數 <express_queue>, <normal_queue>, <ticket_type>, <person_name>,並回傳已加入該人員姓名的對應隊伍。
<ticket_type> 是一個 int,1 == express_queue,0 == normal_queue。<person_name> 是要加入對應隊伍的人員姓名(型別為 str)。>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=1, person_name="RichieRich")
...
["Tony", "Bruce", "RichieRich"]
>>> add_me_to_the_queue(express_queue=["Tony", "Bruce"], normal_queue=["RobotGuy", "WW"], ticket_type=0, person_name="HawkEye")
....
["RobotGuy", "WW", "HawkEye"]
有一個人比較晚到樂園,卻想加入朋友們正在排的隊伍。 但他們不知道朋友們排在哪裡,而且手機收不到訊號,沒辦法打電話給他們。
定義 find_my_friend() 函式,它接受 2 個參數 queue 和 friend_name,並回傳該姓名在隊伍中的位置。
<queue> 是排隊群眾的 list。<friend_name> 是朋友的姓名,你需要找出他的索引(在隊伍中的位置)。請記住: 索引從左邊算起是 0,從右邊算起是 -1。
>>> find_my_friend(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], friend_name="Steve")
...
1
既然已經找到朋友了(在上面的任務 2),這位晚到的人想排到朋友所在的位置。
定義 add_me_with_my_friends() 函式,它接受 3 個參數 queue、index 和 person_name。
<queue> 是排隊群眾的 list。<index> 是新成員要加入的位置。<person_name> 是要加在該索引位置的人員姓名。回傳已加入這位晚到者姓名的隊伍。
>>> add_me_with_my_friends(queue=["Natasha", "Steve", "T'challa", "Wanda", "Rocket"], index=1, person_name="Bucky")
...
["Natasha", "Bucky", "Steve", "T'challa", "Wanda", "Rocket"]
你剛從隊伍裡聽說,有個很討厭的人又推又擠、大聲叫囂,還到處惹麻煩。 你得把這個惡劣的傢伙趕出去,因為他行為不良!
定義 remove_the_mean_person() 函式,它接受 2 個參數 queue 和 person_name。
<queue> 是排隊群眾的 list。<person_name> 是那個需要被踢出去的人之姓名。回傳已移除這個討厭鬼姓名的隊伍。
>>> remove_the_mean_person(queue=["Natasha", "Steve", "Eltran", "Wanda", "Rocket"], person_name="Eltran")
...
["Natasha", "Steve", "Wanda", "Rocket"]
你可能沒見過兩個長得一模一樣、卻毫無血緣關係的人,但你一定見過名字完全相同、彼此毫無關係的人(也就是同名同姓的人)! 今天,現場似乎來了很多這樣的人。 你想知道某個名字在隊伍中出現了幾次。
定義 how_many_namefellows() 函式,它接受 2 個參數 queue 和 person_name。
<queue> 是排隊群眾的 list。<person_name> 是你認為可能在隊伍中出現超過一次的名字。以 int 回傳 person_name 出現的次數。
>>> how_many_namefellows(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"], person_name="Natasha")
...
2
可惜,今天樂園裡太擁擠了,你需要請一般隊伍的最後一個人離開(你會給他一張兌換券,讓他改天再來走快速通關)。
你必須定義 remove_the_last_person() 函式,它接受 1 個參數 queue,也就是排隊民眾的陣列。
你應該更新這個 list,並同時 return 被移除者的姓名,這樣才能開立兌換券給他。
>>> remove_the_last_person(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
'Rocket'
為了行政作業上的需要,你得把某個隊伍裡的所有姓名依字母順序排列。
定義 sorted_names() 函式,它接受 1 個引數 queue(排隊群眾的 list),並回傳這個 list 的 sorted 複本。
>>> sorted_names(queue=["Natasha", "Steve", "Eltran", "Natasha", "Rocket"])
...
['Eltran', 'Natasha', 'Natasha', 'Rocket', 'Steve']