課時12:列表:一個打了激素的陣列3

那是個好男孩發表於2018-08-01

目錄:

  一、一些常用的操作符

  二、列表的小夥伴們

  三、關於分片“拷貝”概念的補充

  四、課時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]]

 

相關文章