列表(3)

2018-02-24 15:48 更新

接著上節(jié)內(nèi)容。下面是上節(jié)中說好要介紹的列表方法:

'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'

已經(jīng)在上節(jié)講解了前四個。

繼續(xù)。

list函數(shù)

insert

前面有向list中追加元素的方法,那個追加是且只能是將新元素添加在list的最后一個。如:

>>> all_users = ["qiwsir","github"]
>>> all_users.append("io")
>>> all_users
['qiwsir', 'github', 'io']

list.append(x)類似,list.insert(i,x)也是對list元素的增加。只不過是可以在任何位置增加一個元素。

還是先看官方文檔來理解

list.insert(i, x)

Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).

這次就不翻譯了。如果看不懂英語,怎么了解貴國呢?一定要硬著頭皮看英語,不僅能夠?qū)W好程序,更能...(此處省略兩千字)

根據(jù)官方文檔的說明,我們做下面的實(shí)驗(yàn),請看官從實(shí)驗(yàn)中理解:

>>> all_users
['qiwsir', 'github', 'io']
>>> all_users.insert("python")      
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: insert() takes exactly 2 arguments (1 given)

請注意看報錯的提示信息,insert()應(yīng)該供給兩個參數(shù),但是這里只給了一個。所以報錯沒商量啦。

>>> all_users.insert(0,"python")
>>> all_users
['python', 'qiwsir', 'github', 'io']

>>> all_users.insert(1,"http://")
>>> all_users
['python', 'http://', 'qiwsir', 'github', 'io']

list.insert(i, x)中的i是將元素x插入到list中的位置,即將x插入到索引值是i的元素前面。注意,索引是從0開始的。

有一種操作,挺有意思的,如下:

>>> length = len(all_users)
>>> length
5       
>>> all_users.insert(length,"algorithm")
>>> all_users
['python', 'http://', 'qiwsir', 'github', 'io', 'algorithm']

在all_users中,沒有索引最大到4,如果要all_users.insert(5,"algorithm"),則表示將"algorithm"插入到索引值是5的前面,但是沒有。換個說法,5前面就是4的后面。所以,就是追加了。

其實(shí),還可以這樣:

>>> a = [1,2,3]
>>> a.insert(9,777)
>>> a
[1, 2, 3, 777]

也就是說,如果遇到那個i已經(jīng)超過了最大索引值,會自動將所要插入的元素放到列表的尾部,即追加。

pop和remove

list中的元素,不僅能增加,還能被刪除。刪除list元素的方法有兩個,它們分別是:

list.remove(x)

Remove the first item from the list whose value is x. It is an error if there is no such item.

list.pop([i])

Remove the item at the given position in the list, and return it. If no index is specified, a.pop() removes and returns the last item in the list. (The square brackets around the i in the method signature denote that the parameter is optional, not that you should type square brackets at that position. You will see this notation frequently in the Python Library Reference.)

我這里講授python,有一個習(xí)慣,就是用學(xué)習(xí)物理的方法。如果看官當(dāng)初物理沒有學(xué)好,那么一定是沒有用這種方法,或者你的老師沒有用這種教學(xué)法。這種方法就是:自己先實(shí)驗(yàn),然后總結(jié)規(guī)律。

先實(shí)驗(yàn)list.remove(x),注意看上面的描述。這是一個能夠刪除list元素的方法,同時上面說明告訴我們,如果x沒有在list中,會報錯。

>>> all_users
['python', 'http://', 'qiwsir', 'github', 'io', 'algorithm']
>>> all_users.remove("http://")
>>> all_users       #的確是把"http://"刪除了
['python', 'qiwsir', 'github', 'io', 'algorithm']

>>> all_users.remove("tianchao")        #原list中沒有“tianchao”,要刪除,就報錯。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

>>> lst = ["python","java","python","c"]
>>> lst.remove("python")
>>> lst
['java', 'python', 'c']

重點(diǎn)解釋一下第三個操作。哦,忘記一個提醒,我在前面的很多操作中,也都給列表的變量命名為lst,但是不是list,為什么呢?因?yàn)閘ist是python的保留字。

還是繼續(xù)第三段操作,列表中有兩個'python'字符串,當(dāng)刪除后,發(fā)現(xiàn)結(jié)果只刪除了第一個'python'字符串,第二個還在。請仔細(xì)看前面的文檔說明:remove the first item ...

注意兩點(diǎn):

  • 如果正確刪除,不會有任何反饋。沒有消息就是好消息。并且是對列表進(jìn)行原地修改。
  • 如果所刪除的內(nèi)容不在list中,就報錯。注意閱讀報錯信息:x not in list

什么是保留字?在python中,當(dāng)然別的語言中也是如此啦。某些詞語或者拼寫是不能被用戶拿來做變量/函數(shù)/類等命名,因?yàn)樗鼈円呀?jīng)被語言本身先占用了。這些就是所謂保留字。在python中,以下是保留字,不能用于你自己變成中的任何命名。

and, assert, break, class, continue, def, del, elif, else, except, exec, finally, for, from, global, if, import, in, is, lambda, not, or, pass, print, raise, return, try, while, with,yield

這些保留字,都是我們在編程中要用到的。有的你已經(jīng)在前面遇到了。

看官是不是想到一個問題?如果能夠在刪除之前,先判斷一下這個元素是不是在list中,如果在就刪,不在就不刪,不是更智能嗎?

如果看官想到這里,就是在編程的旅程上一進(jìn)步。python的確讓我們這么做。

>>> all_users
['python', 'qiwsir', 'github', 'io', 'algorithm']
>>> "python" in all_users       #這里用in來判斷一個元素是否在list中,在則返回True,否則返回False
True

>>> if "python" in all_users:
...     all_users.remove("python")
...     print all_users
... else:
...     print "'python' is not in all_users"
... 
['qiwsir', 'github', 'io', 'algorithm']     #刪除了"python"元素

>>> if "python" in all_users:
...     all_users.remove("python")
...     print all_users
... else:
...     print "'python' is not in all_users"
... 
'python' is not in all_users        #因?yàn)橐呀?jīng)刪除了,所以就沒有了。

上述代碼,就是兩段小程序,我是在交互模式中運(yùn)行的,相當(dāng)于小實(shí)驗(yàn)。這里其實(shí)用了一個后面才會講到的東西:if-else語句。不過,我覺得即使沒有學(xué)習(xí),你也能看懂,因?yàn)樗浅=咏匀徽Z言了。

另外一個刪除list.pop([i])會怎么樣呢?看看文檔,做做實(shí)驗(yàn)。

>>> all_users
['qiwsir', 'github', 'io', 'algorithm']
>>> all_users.pop()     #list.pop([i]),圓括號里面是[i],表示這個序號是可選的
'algorithm'             #如果不寫,就如同這個操作,默認(rèn)刪除最后一個,并且將該結(jié)果返回

>>> all_users
['qiwsir', 'github', 'io']

>>> all_users.pop(1)        #指定刪除編號為1的元素"github"
'github'

>>> all_users
['qiwsir', 'io']
>>> all_users.pop()
'io'

>>> all_users           #只有一個元素了,該元素編號是0
['qiwsir']
>>> all_users.pop(1)    #但是非要刪除編號為1的元素,結(jié)果報錯。注意看報錯信息
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: pop index out of range      #刪除索引超出范圍,就是1不在list的編號范圍之內(nèi)

簡單總結(jié)一下,list.remove(x)中的參數(shù)是列表中元素,即刪除某個元素;list.pop([i])中的i是列表中元素的索引值,這個i用方括號包裹起來,意味著還可以不寫任何索引值,如上面操作結(jié)果,就是刪除列表的最后一個。

給看官留下一個思考題,如果要像前面那樣,能不能事先判斷一下要刪除的編號是不是在list的長度范圍(用len(list)獲取長度)以內(nèi)?然后進(jìn)行刪除或者不刪除操作。

reverse

reverse比較簡單,就是把列表的元素順序反過來。

>>> a = [3,5,1,6]
>>> a.reverse()
>>> a
[6, 1, 5, 3]

注意,是原地反過來,不是另外生成一個新的列表。所以,它沒有返回值。跟這個類似的有一個內(nèi)建函數(shù)reversed,建議讀者了解一下這個函數(shù)的使用方法。

因?yàn)?code>list.reverse()不返回值,所以不能實(shí)現(xiàn)對列表的反向迭代,如果要這么做,可以使用reversed函數(shù)。

sort

sort就是對列表進(jìn)行排序。幫助文檔中這么寫的:

sort(...)

L.sort(cmp=None, key=None, reverse=False) -- stable sort?IN PLACE; cmp(x, y) -> -1, 0, 1

>>> a = [6, 1, 5, 3]
>>> a.sort()
>>> a
[1, 3, 5, 6]

list.sort()也是讓列表進(jìn)行原地修改,沒有返回值。默認(rèn)情況,如上面操作,實(shí)現(xiàn)的是從小到大的排序。

>>> a.sort(reverse=True)
>>> a
[6, 5, 3, 1]

這樣做,就實(shí)現(xiàn)了從大到小的排序。

在前面的函數(shù)說明中,還有一個參數(shù)key,這個怎么用呢?不知道看官是否用過電子表格,里面就是能夠設(shè)置按照哪個關(guān)鍵字進(jìn)行排序。這里也是如此。

>>> lst = ["python","java","c","pascal","basic"]
>>> lst.sort(key=len)
>>> lst
['c', 'java', 'basic', 'python', 'pascal']

這是以字符串的長度為關(guān)鍵詞進(jìn)行排序。

對于排序,也有一個更為常用的內(nèi)建函數(shù)sorted。

順便指出,排序是一個非常有研究價值的話題。不僅僅是現(xiàn)在這么一個函數(shù)。有興趣的讀者可以去網(wǎng)上搜一下排序相關(guān)知識。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號