目錄:
一、一些常用的操作符
二、列表的小夥伴們
三、關於分片“拷貝”概念的補充
四、課時12課後習題及答案
**************************
一、一些常用的操作符
**************************
比較操作符 邏輯操作符 連線操作符 重複操作符 成員關係操作符
我們此前學過的操作符都可以應用到列表上:
>>> list1 = [123] >>> list2 = [234] >>> list1 > list2 False >>> list3 = ["abc"] >>> list4 = ["bcd"] >>> list3 < list4 True
列表看起來挺聰明的,會比較大小,但是列表中不止一個元素呢?
>>> list1 = [123,456] >>> list2 = [234,123] >>> list1 > list2 False
怎麼會這樣呢?明明123+456>234+123.思考片刻,我們知道了,其實Python原來並沒有我們想的那麼“智慧”,當列表包含多個元素的時候,預設是從第一個元素開始比較的,只要有一個元素PK贏了,就算整個列表贏了。字串比較也是同樣的道理(字串比較的是第一個字元對應的ASCII碼值的大小)。
我們知道字串可以用加號(+)來進行拼接,用乘號(*)來複制自身若干次。他們在列表身上也可以實現的:
>>> list1 = [123,456] >>> list2 = [234,123] >>> list3 = list1 + list2 >>> list3 [123, 456, 234, 123]
加號也叫做連線操作符,它允許我們把多個列表物件合併在一起,其實就相當於extend()方法實現的效果。一般情況下建議大家使用extend()方法擴充套件列表,因為這樣顯得更加的專業和規範。另外,連線操作符並不能實現列表新增新元素的操作:
>>> list1 = [123,456] >>> list2 = list1 + 789 Traceback (most recent call last): File "<pyshell#14>", line 1, in <module> list2 = list1 + 789 TypeError: can only concatenate list (not "int") to list
所以如果要新增一個元素到列表中,使用什麼辦法呢?可以用append()或者insert()方法。乘號(*)也叫重複操作符,重複操作符可以應用於列表中:
>>> list1 = [123] >>> list1*3 [123, 123, 123]
當然複合賦值運算子也可以用於列表中:
>>> list1 * =5 SyntaxError: invalid syntax >>> list1 *= 5 >>> list1 [123, 123, 123, 123, 123]
還有成員操作符in 和 not in
>>> list1 = ["小豬""小貓""小狗""小甲魚"] >>> "小甲魚"in list1 False >>> list1 = ["小豬","小貓","小狗","小甲魚"] >>> "小甲魚"in list1 True >>> "小護士"in list1 False
之前說過一個列表中可以包含另一個列表,那麼對於列表中的列表元素,能不能用in和not in測試呢?
>>> list1 = ["小豬","小貓",["小甲魚","小護士"],"小狗"] >>> "小甲魚" in list1 False >>> "小護士" not in list1 True
可見,in和in not只能判斷一個層次的成員關係,這跟break和continue語句只能作用於一個層次的迴圈是一個道理。那要判斷列表裡邊的列表的元素,應該先進入一層列表:
>>> "小甲魚" in list1[2] True >>> "小護士" not in list1[2] False
順便說一下,前面提到使用索引號去訪問列表中的值,那麼對於列表中的列表,應該如何訪問呢?
>>> list1[2][0] '小甲魚'
***********************
二、列表的小夥伴們
***********************
列表一共有多少個小夥伴呢?
>>> dir(list) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
count()這個方法的作用是計算它的引數在列表中出現的次數:
>>> list1 = [1,1,2,3,5,8,13,21] >>> list1.count(1) 2
index()這個方法會返回它的引數在列表中的位置:
>>> list1.index(1)
0
可以看到,這裡是返回第一個目標(1)在list1中的位置,index()方法有兩個引數,用於限定查詢的範圍。因此可以這樣查詢第二個目標在list1的位置:
>>> start = list1.index(1) + 1 >>> stop = len(list1) >>> list1.index(1,start,stop) 1
reverse()方法的作用是將整個列表原地翻轉,就是排最後的放到最前邊,排最前面的放在最後,那麼排倒數第二的排在第二,以此類推:
>>> list1 = [1,2,3,4,5,6,7,8] >>> list1.reverse() >>> list1 [8, 7, 6, 5, 4, 3, 2, 1]
sort()這個方法的作用是用指定的方式對列表的成員進行排序,預設不需要引數,從小到大排隊:
>>> list1 = [8,9,3,5,2,6,10,1,0] >>> list1.sort() >>> list1 [0, 1, 2, 3, 5, 6, 8, 9, 10]
那如果要從大到小的進行排序呢?很簡單,先sort()再reverse().太麻煩?!沒錯,很麻煩。其實,sort()這個方法有三個引數:其形式為sort(func,key,reverse)
func和key引數用於設定排序的演算法和關鍵字,預設是使用歸併演算法。這裡討論第三個引數:reverse,它作為sort的一個預設引數,它的預設值是sort(reverce=False),表示不顛倒順序。
因此,只需要把False改為True,列表就相當於從大到小排序:
>>> list1 = [1,2,3,4,5,6,7,8] >>> list1.reverse() >>> list1 [8, 7, 6, 5, 4, 3, 2, 1] >>> list1 = [8,9,3,5,2,6,10,1,0] >>> list1.sort() >>> list1 [0, 1, 2, 3, 5, 6, 8, 9, 10] >>> list1 = [8,9,3,5,2,6,10,1,0] >>> list1.sort(reverse=True) >>> list1 [10, 9, 8, 6, 5, 3, 2, 1, 0]
***********************************
三、關於分片“拷貝”概念的補充
***********************************
上一節提到使用分片建立列表的拷貝:
>>> list1 = [1,3,2,9,7,8] >>> list2 = list1[:] >>> list2 [1, 3, 2, 9, 7, 8] >>> list3 = list1 >>> list3 [1, 3, 2, 9, 7, 8]
看似一樣,但事實上呢?利用列表的一個小夥伴進行修改,看有何不同:
>>> list1.sort() >>> list1 [1, 2, 3, 7, 8, 9] >>> list2 [1, 3, 2, 9, 7, 8] >>> list3 [1, 2, 3, 7, 8, 9]
用一個圖來解釋:
大家應該明白了吧,為了一個列表指定另一個名字的做法,只是向同一個列表增加一個新的標籤而已,真正的拷貝是要使用分片的方法。
********************************
四、 課時12課後習題及答案
*********************************
測試題:
0.注意,這道題跟上節課的那道題有點兒不同,回答完請上機實驗或參考答案。
old = [1, 2, 3, 4, 5] new = old old = [6] print(new)
如果不上機操作,你覺得會列印什麼內容?
1. 請問如何將下邊這個列表的'小甲魚'修改為'小魷魚'?
list1 = [1, [1, 2, ['小甲魚']], 3, 5, 8, 13, 18]
2. 要對一個列表進行順序排序,請問使用什麼方法?
3. 要對一個列表進行逆序排序,請問使用什麼方法?
4. 列表還有兩個內建方法沒給大家介紹,不過聰明的你應該可以自己摸索使用的門道吧:copy() 和 clear()
5. 你有聽說過列表推導式或列表解析嗎?
沒聽過?!沒關係,我們現場來學習一下吧,看錶達式:
>>> [ i*i for i in range(10) ]
你覺得會列印什麼內容?
>>> [i*i for i in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
居然分別列印了0到9各個數的平方,然後還放在列表裡邊了有木有?!
列表推導式(List comprehensions)也叫列表解析,靈感取自函數語言程式設計語言 Haskell。Ta 是一個非常有用和靈活的工具,可以用來動態的建立列表,語法如:
[有關A的表示式 for A in B]
例如
>>> list1 = [x**2 for x in range(10)] >>> list1 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
相當於
list1 = [] for x in range(10): list1.append(x**2)
問題:請先在 IDLE 中獲得下邊列表的結果,並按照上方例子把列表推導式還原出來。
>>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]
6. 活學活用:請使用列表推導式補充被小甲魚不小心塗掉的部分
答案:
測試題答案:
0. 注意,這道題跟上節課的那道題有點兒不同,回答完請上機實驗或參考答案。
>>> old = [1, 2, 3, 4, 5] >>> new = old >>> old = [6] >>> print(new)
會列印:[1, 2, 3, 4, 5]
這裡我歪打正著產生了些許疑問,疑問和解決方案詳見網址:網址(點選它!)
1. 請問如何將下邊這個列表的'小甲魚'修改為'小魷魚'?
list1 = [1, [1, 2, ['小甲魚']], 3, 5, 8, 13, 18] list1[1][2][0] = '小魷魚'
>>> list1 = [1, [1, 2, ['小甲魚']], 3, 5, 8, 13, 18]
>>> list1[1]
[1, 2, ['小甲魚']]
>>> list1[1][2]
['小甲魚']
>>> list1[1][2][0]
'小甲魚'
2. 要對一個列表進行順序排序,請問使用什麼方法?
>>> 列表名.sort()
3. 要對一個列表進行逆序排序,請問使用什麼方法?
>>> 列表名.sort()
>>> 列表名.reverse()
或者
>>> 列表名.sort(reverse=True)
4. 列表還有兩個內建方法沒給大家介紹,不過聰明的你應該可以自己摸索使用的門道吧:copy() 和 clear()
copy() 方法跟使用切片拷貝是一樣的:
>>> list2 = list1.copy() >>> list2 [1, [1, 2, ['小甲魚']], 3, 5, 8, 13, 18]
clear() 方法用於清空列表的元素,但要注意,清空完後列表仍然還在哦,只是變成一個空列表。
>>> list2.clear() >>> list2 []
5. 問題:請先在 IDLE 中獲得下邊列表的結果,並按照上方例子把列表推導式還原出來。
>>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0]
list1 = [] for x in range(10): for y in range(10): if x%2 == 0: if y%2 != 0: list1.append((x, y))
6. 活學活用:請使用列表推導式補充被小甲魚不小心塗掉的部分
>>> list3 = [name + ':' + slogan[2:] for slogan in list1 for name in list2 if slogan[0] == name[0]]