列表(1)

2018-02-24 15:48 更新

前面的學(xué)習(xí)中,我們已經(jīng)知道了兩種python的數(shù)據(jù)類(lèi)型:int和str。再?gòu)?qiáng)調(diào)一下對(duì)數(shù)據(jù)類(lèi)型的理解,這個(gè)世界是由數(shù)據(jù)組成的,數(shù)據(jù)可能是數(shù)字(注意,別搞混了,數(shù)字和數(shù)據(jù)是有區(qū)別的),也可能是文字、或者是聲音、視頻等。在python中(其它高級(jí)語(yǔ)言也類(lèi)似)把狀如2,3這樣的數(shù)字劃分為一個(gè)類(lèi)型,把狀如“你好”這樣的文字劃分一個(gè)類(lèi)型,前者是int類(lèi)型,后者是str類(lèi)型(這里就不說(shuō)翻譯的名字了,請(qǐng)看官熟悉用英文的名稱(chēng),對(duì)日后編程大有好處,什么好處呢?誰(shuí)用誰(shuí)知道!)。

前面還學(xué)習(xí)了變量,如果某個(gè)變量指向一個(gè)對(duì)象(某種類(lèi)型的數(shù)據(jù))行話(huà)是:賦值),通常這個(gè)變量我們就把它叫做int類(lèi)型的變量(注意,這種說(shuō)法是不嚴(yán)格的,或者是受到別的語(yǔ)言影響的,在python中,特別要注意:變量沒(méi)有類(lèi)型,對(duì)象有類(lèi)型。在python里,變量不用提前聲明(在某些語(yǔ)言,如JAVA中需要聲明變量之后才能使用。這個(gè)如果看官?zèng)]有了解,不用擔(dān)心,因?yàn)槲覀兪菍W(xué)習(xí)python,以后學(xué)習(xí)的語(yǔ)言多了,自然就能體會(huì)到這點(diǎn)區(qū)別了),隨用隨命名。

這一講中的list類(lèi)型,也是python的一種數(shù)據(jù)類(lèi)型。翻譯為:列表。下面的黑字,請(qǐng)看官注意了:

LIST在python中具有非常強(qiáng)大的功能。

定義

在python中,用方括號(hào)表示一個(gè)list,[ ]

在方括號(hào)里面,可以是int,也可以是str類(lèi)型的數(shù)據(jù),甚至也能夠是True/False這種布爾值??聪旅娴睦?,特別注意閱讀注釋。

>>> a=[]        #定義了一個(gè)變量a,它是list類(lèi)型,并且是空的。
>>> type(a)
<type 'list'>   #用內(nèi)置函數(shù)type()查看變量a的類(lèi)型,為list
>>> bool(a)     #用內(nèi)置函數(shù)bool()看看list類(lèi)型的變量a的布爾值,因?yàn)槭强盏模詾镕alse
False
>>> print a     #打印list類(lèi)型的變量a
[]

bool()是一個(gè)布爾函數(shù),這個(gè)東西后面會(huì)詳述。它的作用就是來(lái)判斷一個(gè)對(duì)象是“真”還是“空”(假)。如果想上面例子那樣,list中什么也沒(méi)有,就是空的,用bool()函數(shù)來(lái)判斷,得到False,從而顯示它是空的。

不能總玩空的,來(lái)點(diǎn)實(shí)的吧。

>>> a=['2',3,'qiwsir.github.io']
>>> a
['2', 3, 'qiwsir.github.io']
>>> type(a)
<type 'list'>
>>> bool(a)
True
>>> print a
['2', 3, 'qiwsir.github.io']

用上述方法,定義一個(gè)list類(lèi)型的變量和數(shù)據(jù)。

本講的標(biāo)題是“有容乃大的list”,就指明了list的一大特點(diǎn):可以無(wú)限大,就是說(shuō)list里面所能容納的元素?cái)?shù)量無(wú)限,當(dāng)然這是在硬件設(shè)備理想的情況下。

如果看官以后或者已經(jīng)了解了別的語(yǔ)言,比如比較常見(jiàn)的Java,里面有一個(gè)跟list相似的數(shù)據(jù)類(lèi)型——數(shù)組——但是兩者還是有區(qū)別的。在Java中,數(shù)組中的元素必須是基本數(shù)據(jù)類(lèi)型中某一個(gè),也就是要么都是int類(lèi)型,要么都是char類(lèi)型等,不能一個(gè)數(shù)組中既有int類(lèi)型又有char類(lèi)型。這是因?yàn)閖ava中的數(shù)組,需要提前聲明,聲明的時(shí)候就確定了里面元素的類(lèi)型。但是python中的list,盡管跟java中的數(shù)組有類(lèi)似的地方——都是[]包裹的——list中的元素是任意類(lèi)型的,可以是int,str,甚至還可以是list,乃至于是以后要學(xué)的dict等。所以,有一句話(huà)說(shuō):List是python中的苦力,什么都可以干。

索引和切片

尚記得在《字符串(3)》中,曾經(jīng)給“索引”(index)和“切片”。

>>> url = "qiwsir.github.io"
>>> url[2]
'w'
>>> url[:4]
'qiws'
>>> url[3:9]
'sir.gi'

在list中,也有類(lèi)似的操作。只不過(guò)是以元素為單位,不是以字符為單位進(jìn)行索引了??蠢泳兔靼琢?。

>>> a
['2', 3, 'qiwsir.github.io']
>>> a[0]    #索引序號(hào)也是從0開(kāi)始
'2'
>>> a[1]
3
>>> [2]
[2]
>>> a[:2]   #跟str中的類(lèi)似,切片的范圍是:包含開(kāi)始位置,到結(jié)束位置之前
['2', 3]    #不包含結(jié)束位置
>>> a[1:]
[3, 'qiwsir.github.io']

list和str兩種類(lèi)型的數(shù)據(jù),有共同的地方,它們都屬于序列(都是一些對(duì)象按照某個(gè)次序排列起來(lái),這就是序列的最大特征),因此,就有很多類(lèi)似的地方。如剛才演示的索引和切片,是非常一致的。

>>> lang = "python"
>>> lang.index("y")
1
>>> lst = ['python','java','c++']
>>> lst.index('java')
1

在前面講述字符串索引和切片的時(shí)候,以及前面的演示,所有的索引都是從左邊開(kāi)始編號(hào),第一個(gè)是0,然后依次增加1。此外,還有一種編號(hào)方式,就是從右邊開(kāi)始,右邊第一個(gè)可以編號(hào)為-1,然后向左依次是:-2,-3,...,依次類(lèi)推下來(lái)。這對(duì)字符串、列表等各種序列類(lèi)型都是用。

>>> lang
'python'
>>> lang[-1]
'n'
>>> lst
['python', 'java', 'c++']
>>> lst[-1]
'c++'

從右邊開(kāi)始編號(hào),第-1號(hào)是右邊第一個(gè)。但是,如果要切片的話(huà),應(yīng)該注意了。

>>> lang[-1:-3]
''
>>> lang[-3:-1]
'ho'
>>> lst[-3:-1]
['python', 'java']

序列的切片,一定要左邊的數(shù)字小有右邊的數(shù)字,lang[-1:-3]就沒(méi)有遵守這個(gè)規(guī)則,返回的是一個(gè)空。

反轉(zhuǎn)

這個(gè)功能作為一個(gè)獨(dú)立的項(xiàng)目提出來(lái),是因?yàn)樵诰幊讨谐3?huì)用到。通過(guò)舉例來(lái)說(shuō)明反轉(zhuǎn)的方法:

>>> alst = [1,2,3,4,5,6]
>>> alst[::-1]    #反轉(zhuǎn)
[6, 5, 4, 3, 2, 1]
>>> alst
[1, 2, 3, 4, 5, 6]

當(dāng)然,對(duì)于字符串也可以

>>> lang
'python'
>>> lang[::-1]
'nohtyp'
>>> lang
'python'

看官是否注意到,上述不管是str還是lst反轉(zhuǎn)之后,再看原來(lái)的值,沒(méi)有改變。這就說(shuō)明,這里的反轉(zhuǎn),不是在“原地”把原來(lái)的值倒過(guò)來(lái),而是新生成了一個(gè)值,那個(gè)值跟原來(lái)的值相比,是倒過(guò)來(lái)了。

這是一種非常簡(jiǎn)單的方法,雖然我在寫(xiě)程序的時(shí)候常常使用,但是,我不是十分推薦,因?yàn)橛袝r(shí)候讓人感覺(jué)迷茫。python還有另外一種方法讓list反轉(zhuǎn),是比較容易理解和閱讀的,特別推薦之:

>>> list(reversed(alst))
[6, 5, 4, 3, 2, 1]

比較簡(jiǎn)單,而且很容易看懂。不是嗎?

順便給出reversed函數(shù)的詳細(xì)說(shuō)明:

>>> help(reversed)
Help on class reversed in module __builtin__:

class reversed(object)
 |  reversed(sequence) -> reverse iterator over values of the sequence
 |  
 |  Return a reverse iterator

它返回一個(gè)可以迭代的對(duì)象(關(guān)于迭代的問(wèn)題,后續(xù)會(huì)詳述之),不過(guò)是已經(jīng)將原來(lái)的序列對(duì)象反轉(zhuǎn)了。比如:

>>> list(reversed("abcd"))
['d', 'c', 'b', 'a']

很好,很強(qiáng)大,特別推薦使用。

對(duì)list的操作

任何一個(gè)行業(yè)都有自己的行話(huà),如同古代的強(qiáng)盜,把撤退稱(chēng)之為“扯乎”一樣,縱然是一個(gè)含義,但是強(qiáng)盜們?cè)敢庥盟麄冏约旱男袠I(yè)用語(yǔ),俗稱(chēng)“黑話(huà)”。各行各業(yè)都如此。這樣做的目的我理解有兩個(gè),一個(gè)是某種保密;另外一個(gè)是行外人士顯示本行業(yè)的門(mén)檻,讓別人感覺(jué)這個(gè)行業(yè)很高深,從業(yè)者有一定水平。

不管怎么,在python和很多高級(jí)語(yǔ)言中,都給本來(lái)數(shù)學(xué)角度就是函數(shù)的東西,又在不同情況下有不同的稱(chēng)呼,如方法、類(lèi)等。當(dāng)然,這種稱(chēng)呼,其實(shí)也是為了區(qū)分函數(shù)的不同功能。

前面在對(duì)str進(jìn)行操作的時(shí)候,有一些內(nèi)置函數(shù),比如s.strip(),這是去掉左右空格的內(nèi)置函數(shù),也是str的方法。按照一貫制的對(duì)稱(chēng)法則,對(duì)list也會(huì)有一些操作方法。

在講述字符串的時(shí)候,提到過(guò),所有的序列,都有幾種基本操作。list當(dāng)然如此。

基本操作

  • len()

在交互模式中操作:

>>> lst
['python', 'java', 'c++']
>>> len(lst)
3
  • +,連接兩個(gè)序列

交互模式中:

>>> lst
['python', 'java', 'c++']
>>> alst
[1, 2, 3, 4, 5, 6]
>>> lst + alst
['python', 'java', 'c++', 1, 2, 3, 4, 5, 6]
  • *,重復(fù)元素

交互模式中操作

>>> lst
['python', 'java', 'c++']
>>> lst * 3
['python', 'java', 'c++', 'python', 'java', 'c++', 'python', 'java', 'c++']
  • in

列表lst還是前面的值

>>> "python" in lst
True
>>> "c#" in lst
False
  • max()和min()

以int類(lèi)型元素為例。如果不是,都是按照字符在ascii編碼中所對(duì)應(yīng)的數(shù)字進(jìn)行比較的。

>>> alst
[1, 2, 3, 4, 5, 6]
>>> max(alst)
6
>>> min(alst)
1
>>> max(lst)
'python'
>>> min(lst)
'c++'
  • cmp()

采用上面的方法,進(jìn)行比較

>>> lsta = [2,3]
>>> lstb = [2,4]
>>> cmp(lsta,lstb)
-1
>>> lstc = [2]
>>> cmp(lsta,lstc)
1
>>> lstd = ['2','3']
>>> cmp(lsta,lstd)
-1

追加元素

>>> a = ["good","python","I"]      
>>> a
['good', 'python', 'I']
>>> a.append("like")        #向list中添加str類(lèi)型"like"
>>> a
['good', 'python', 'I', 'like']
>>> a.append(100)           #向list中添加int類(lèi)型100
>>> a
['good', 'python', 'I', 'like', 100]

官方文檔這樣描述list.append()方法

list.append(x)

Add an item to the end of the list; equivalent to a[len(a):] = [x].

從以上描述中,以及本部分的標(biāo)題“追加元素”,是不是能夠理解list.append(x)的含義呢?即將新的元素x追加到list的尾部。

列位看官,如果您注意看上面官方文檔中的那句話(huà),應(yīng)該注意到,還有后面半句: equivalent to a[len(a):] = [x],意思是說(shuō)list.append(x)等效于:a[len(a):]=[x]。這也相當(dāng)于告訴我們了另外一種追加元素的方法,并且兩種方法等效。

>>> a
['good', 'python', 'I', 'like', 100]
>>> a[len(a):]=[3]      #len(a),即得到list的長(zhǎng)度,這個(gè)長(zhǎng)度是指list中的元素個(gè)數(shù)。
>>> a
['good', 'python', 'I', 'like', 100, 3]
>>> len(a)
6
>>> a[6:]=['xxoo']
>>> a
['good', 'python', 'I', 'like', 100, 3, 'xxoo']
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)