5. 數(shù)據(jù)類(lèi)型 —— 列表

列表屬于容器存儲(chǔ)、可變跃巡、順序訪問(wèn)的數(shù)據(jù)類(lèi)型危号。列表可以包含任何種類(lèi)的對(duì)象或者嵌套,借助列表可以構(gòu)造許多復(fù)雜的數(shù)據(jù)結(jié)構(gòu)素邪,因此列表也是平時(shí)最經(jīng)常用到的數(shù)據(jù)類(lèi)型外莲。

1. 創(chuàng)建列表

列表使用方括號(hào) [ ] 來(lái)定義,直接把一個(gè)被 [ ] 包含,并由逗號(hào) , 分隔的數(shù)據(jù)賦值給一個(gè)變量即可創(chuàng)建列表對(duì)象偷线。

>>> li = [1, 2, 3]                              # 通過(guò)直接將列表賦值來(lái)創(chuàng)建列表數(shù)據(jù)對(duì)象
>>> li
[1, 2, 3]
>>> li = [ ]                                    # 在方括號(hào)中不包含任何數(shù)據(jù)磨确,一個(gè)空列表
>>> li
[ ]
>>> li = [1, 'a', [3]]                          # 列表中可以包含任意類(lèi)型的數(shù)據(jù)對(duì)象
>>> li
[1, 'a', [3]]

還可以使用 list() 函數(shù)創(chuàng)建列表對(duì)象

>>> li = list('abcd')
>>>li
['a', 'b', 'c', 'd']

2. 列表的基本操作

  • 訪問(wèn)列表元素

    列表屬于順序訪問(wèn)的數(shù)據(jù)類(lèi)型,因此列表可以通過(guò)索引和切片來(lái)訪問(wèn)列表中的元素

li = [1, 2, 3, 4, 5, 6, 7]
li[0] # 列表索引和字符串一樣声邦,從 0 開(kāi)始乏奥,最大為列表的長(zhǎng)度 - 1
1
li[-1] # 使用負(fù)索引訪問(wèn)列表元素
7
li[1:3] # 列表的切片操作返回一個(gè)包含列表部分元素的新的列表
[2, 3]
li[::-1] # 反序訪問(wèn)列表
[7, 6, 5, 4, 3, 2, 1]
li = [[1, 2, 3]]
li[0][1] # 列表中嵌套的任意序列數(shù)據(jù)類(lèi)型的訪問(wèn)
2
```

  • 修改列表

    等號(hào)左側(cè)使用索引或切片指定要更改的元素位置,等號(hào)右側(cè)為要更改的值即可對(duì)列表元素進(jìn)行修改

li = [1, 2, 3]
li[0] = 0 # 對(duì)指定索引的元素重新賦值即可修改列表
li
[0, 2, 3]
li[:2] = [7, 7] # 對(duì)切片進(jìn)行重新賦值修改列表
li
[7, 7, 3]
li[:2] = 3 # 列表的一個(gè)切片為新的列表亥曹,因此修改時(shí)等號(hào)右邊也必須時(shí)一個(gè)列表邓了,否則會(huì)引發(fā)一個(gè) TypeError 錯(cuò)誤
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only assign an iterable
li[:2] = [3] # 對(duì)切片重新賦值不需要等號(hào)左右兩側(cè)的長(zhǎng)度相同,但有可能會(huì)改變?cè)斜淼拈L(zhǎng)度
li
[3, 3]
```

  • 刪除列表元素

    指定列表索引或切片媳瞪,使用 del 關(guān)鍵字即可刪除列表元素骗炉。另外列表還有一些專(zhuān)門(mén)用來(lái)刪除元素的方法,后邊介紹蛇受。

li = [1, 2, 3]
del li[0] # 指定要?jiǎng)h除列表的索引痕鳍,使用 del 刪除列表元素
li
[2, 3]
del li[:] # 如果 del 后為切片,則將整個(gè)切片進(jìn)行刪除
li
[ ]
```

3. 序列的操作符和函數(shù)

操作符
  • + 操作符:對(duì)列表使用 + 操作符可以將多個(gè)列表合并為一個(gè)列表

list1 = [0, 1, 2]
list2 = [3, 4, 5]
list1 + list2
[0, 1, 2, 3, 4, 5] # + 操作符將列表合并
```

  • * 操作符:使用 * 操作符可以將列表重復(fù) N 次

li = [1, 2, 3]
li * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3] # * 操作符后便跟數(shù)字龙巨,表示重復(fù) N 次
```

  • innot in :成員關(guān)系操作笼呆,測(cè)試對(duì)象是否是列表的成員

li = [1, 2, 3]
1 in li # 當(dāng)測(cè)試對(duì)象在列表中時(shí)返回 True
True
0 in li # 當(dāng)測(cè)試對(duì)象不在列表中時(shí)返回 False
False
[1, 2] in li # 測(cè)試對(duì)象整體視為列表中的一個(gè)元素
False
```

序列函數(shù)

僅就常見(jiàn)函數(shù)進(jìn)行舉例說(shuō)明

  • len():返回列表中包含的元素個(gè)數(shù)

li = [1, 2, 3]
len(li) # 返回列表長(zhǎng)度
3
li = [1, 2, [1, 2, 3]] # 列表長(zhǎng)度為列表中元素的個(gè)數(shù)
len(li)
3
```

  • max()min():返回列表中的最大或最小元素。注意:混合類(lèi)型進(jìn)行比較往往精度較差旨别,通常這樣做也不會(huì)有什么實(shí)際意義诗赌,因此建議盡量減少不同類(lèi)型對(duì)象的比較

li = [1, 2, 3]
max(li) # 返回列表中的最大值
3
min(li) # 返回列表中的最小值
1
```

  • sorted() :對(duì)列表中的元素進(jìn)行排序

li = ['b', 'a', 'c']
sorted(li) # 將列表中的元素按照從小到大的順序進(jìn)行排序
['a', 'b', 'c']
```

  • reversed()enumerate() 秸弛、zip() :用法參考 字符串 中的描述

  • sum():如果列表中的對(duì)象均為數(shù)字铭若,則可以使用 sum() 函數(shù)進(jìn)行求和

li = [1, 2, 3]
sum(li) # 將純數(shù)字組成的列表進(jìn)行元素求和

list1 = [0, 1, 2]
>>> list2 = [3, 4, 5]
>>> list1 + list2
[0, 1, 2, 3, 4, 5] # + 操作符將列表合并
- `*` 操作符:使用 * 操作符可以將列表重復(fù) N 次
>>> li = [1, 2, 3]
>>> li * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3] # * 操作符后便跟數(shù)字,表示重復(fù) N 次
- `in` 和 `not in` :成員關(guān)系操作递览,測(cè)試對(duì)象是否是列表的成員
>>> li = [1, 2, 3]
>>> 1 in li # 當(dāng)測(cè)試對(duì)象在列表中時(shí)返回 True
True
>>> 0 in li # 當(dāng)測(cè)試對(duì)象不在列表中時(shí)返回 False
False
>>> [1, 2] in li # 測(cè)試對(duì)象整體視為列表中的一個(gè)元素
False
##### 序列函數(shù) 僅就常見(jiàn)函數(shù)進(jìn)行舉例說(shuō)明 - __len()__:返回列表中包含的元素個(gè)數(shù)
>>> li = [1, 2, 3]
>>> len(li) # 返回列表長(zhǎng)度
3
>>> li = [1, 2, [1, 2, 3]] # 列表長(zhǎng)度為列表中元素的個(gè)數(shù)
>>> len(li)
3
- __max()__ 和 __min()__:返回列表中的最大或最小元素叼屠。注意:混合類(lèi)型進(jìn)行比較往往精度較差,通常這樣做也不會(huì)有什么實(shí)際意義绞铃,因此建議盡量減少不同類(lèi)型對(duì)象的比較
>>> li = [1, 2, 3]
>>> max(li) # 返回列表中的最大值
3
>>> min(li) # 返回列表中的最小值
1
- __sorted()__ :對(duì)列表中的元素進(jìn)行排序
>>> li = ['b', 'a', 'c']
>>> sorted(li) # 將列表中的元素按照從小到大的順序進(jìn)行排序
['a', 'b', 'c']
- __reversed()__镜雨、__enumerate()__ 、__zip()__ :用法參考 [字符串](http://www.reibang.com/p/28b17449d92f) 中的描述 - __sum()__:如果列表中的對(duì)象均為數(shù)字儿捧,則可以使用 __sum()__ 函數(shù)進(jìn)行求和
>>> li = [1, 2, 3]
>>> sum(li) # 將純數(shù)字組成的列表進(jìn)行元素求和
6
sum(li, 4) # sum 函數(shù)可以有第二個(gè)參數(shù)荚坞,但第二個(gè)參數(shù)只能是數(shù)字,否則會(huì)報(bào)錯(cuò)
10
```

4. 列表內(nèi)建函數(shù)

  • append(obj):在列表后邊追加一個(gè)元素

li = [1, 2, 3]
li.append(4) # append 只接受一個(gè)參數(shù)菲盾,并將該參數(shù)添加的列表的末尾
li
[1, 2, 3, 4]
```

  • insert(index, obj):指定要插入位置的索引颓影,將元素插入到列表中

li = [1, 2, 3]
li.insert(1, 'a') # insert 第一個(gè)參數(shù)為要插入位置的索引,第二個(gè)參數(shù)為要插入列表的對(duì)象
li
[1, 'a', 2, 3]
```

  • extend(list):將參數(shù)列表的內(nèi)容添加到列表的結(jié)尾

list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2) # 調(diào)用 extend 函數(shù)可以擴(kuò)展列表
list1
[1, 2, 3, 4, 5, 6]
```

  • remove(obj)懒鉴;從列表中刪除指定元素

li = [1, 2, 3]
li.remove(2) # 刪除指定元素
li
[1, 3]
li = [1, 2, 3, 1]
li.remove(1) # 如果列表中存在多個(gè)指定的元素诡挂,則刪除索引最小的那個(gè)
li
[2, 3, 1]
li.remove(4) # 當(dāng)試圖刪除一個(gè)列表中不存在的元素時(shí)會(huì)引發(fā)異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
```

  • pop(index=-1):刪除并返回指定位置的對(duì)象,默認(rèn)為最后一個(gè)

li = [1, 2, 3]
li.pop() # 默認(rèn)刪除并返回列表中的最后一個(gè)元素
3
li
[1, 2]
li.pop(0) # 可以指定元素的索引值,刪除并返回該元素
1
li
[2]
li.pop(3) # 指定的索引值越界時(shí)引發(fā)異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
```

  • index(obj, i = 0, j = len (list) ):返回 obj 在列表中的索引璃俗,范圍為 i - j

li = [1, 2, 3, 1]
li.index(2) # 查找并返回元素的索引
1
li.index(1) # 如果存在多個(gè)元素南捂,返回找到的一個(gè)索引
0
li.index(7) # 查找的元素在列表中不存在時(shí),引起異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
list1 = [1, 2, 3]
>>> list2 = [4, 5, 6]
>>> list1.extend(list2) # 調(diào)用 extend 函數(shù)可以擴(kuò)展列表
>>> list1
[1, 2, 3, 4, 5, 6]
- __remove(obj)__旧找;從列表中刪除指定元素
>>> li = [1, 2, 3]
>>> li.remove(2) # 刪除指定元素
>>> li
[1, 3]
>>> li = [1, 2, 3, 1]
>>> li.remove(1) # 如果列表中存在多個(gè)指定的元素,則刪除索引最小的那個(gè)
>>> li
[2, 3, 1]
>>> li.remove(4) # 當(dāng)試圖刪除一個(gè)列表中不存在的元素時(shí)會(huì)引發(fā)異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
- __pop(index=-1)__:刪除并返回指定位置的對(duì)象麦牺,默認(rèn)為最后一個(gè)
>>> li = [1, 2, 3]
>>> li.pop() # 默認(rèn)刪除并返回列表中的最后一個(gè)元素
3
>>> li
[1, 2]
>>> li.pop(0) # 可以指定元素的索引值钮蛛,刪除并返回該元素
1
>>> li
[2]
>>> li.pop(3) # 指定的索引值越界時(shí)引發(fā)異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
- __index(obj, i = 0, j = len (list) )__:返回 obj 在列表中的索引,范圍為 i - j
>>> li = [1, 2, 3, 1]
>>> li.index(2) # 查找并返回元素的索引
1
>>> li.index(1) # 如果存在多個(gè)元素剖膳,返回找到的一個(gè)索引
0
>>> li.index(7) # 查找的元素在列表中不存在時(shí)魏颓,引起異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 7 is not in list
```

  • count(obj):返回 obj 在列表中出現(xiàn)的次數(shù)

li = [1, 2, 3, 1]
li.count(1) # 返回對(duì)象在列表中出現(xiàn)的次數(shù)
2
li.count(7) # 如果列表中不存在該對(duì)象,不會(huì)引發(fā)異常吱晒,而是返回 0
0
```

  • sort(func = None, key = None, reverse = False):以指定方式對(duì)列表進(jìn)行排序甸饱,當(dāng) reverse = True 時(shí)反序排列

li = [1, 2, 3, 1]
li.sort() # 對(duì)列表使用 sort 函數(shù)會(huì)直接對(duì)列表進(jìn)行修改
li
[1, 1, 2, 3]
li.sort(reverse = True) # 當(dāng) reverse = True 時(shí)反序排列
li
[3, 2, 1, 1]
```

  • reverse():原地就地反轉(zhuǎn)列表

li = [1, 2, 3, 1]
li.reverse()
li
[1, 3, 2, 1]
```

  • 除此之外列表還有非常強(qiáng)大的列表解析,這里暫不列出仑濒,僅舉一個(gè)例子叹话。

[i for i in [1, 2, 3, 4, 5, 6, 7, 8, 9] if i % 2 == 0 ]
[2, 4, 6, 8] # 篩選出偶數(shù)并構(gòu)建出對(duì)應(yīng)的列表
```

5. 使用列表構(gòu)建一些數(shù)據(jù)結(jié)構(gòu)

  • 堆棧:堆棧是一個(gè)后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),可以通過(guò)列表來(lái)創(chuàng)建堆棧墩瞳。
stack = []

def stack_push():                             # 將對(duì)象加入堆棧中
    stack.append(raw_input("Enter New Object :").strip())

def stack_pop():                              # 將對(duì)象從堆棧中刪除驼壶,后進(jìn)先出
    if len(stack) == 0:
        print "Can not pop object from an empty stack !"
    else:
        print "Remove ", stack.pop()
  • 隊(duì)列:隊(duì)列是一個(gè)先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu)
queue = []

def queue_push():                            # 將對(duì)象加入到隊(duì)列中
    queue.append(raw_input("Enter New Object :").strip())

def queue_pop():                             # 將對(duì)象從隊(duì)列中刪除,先進(jìn)先出
    if len(queue) == 0:
        print "Can not pop object from empty queue !"
    else:
        print "Remove", queue.pop(0)
  • 使用列表可以創(chuàng)建許多復(fù)雜的數(shù)據(jù)結(jié)構(gòu)喉酌,列表也是我們最常用的 Python 數(shù)據(jù)類(lèi)型

6. 更多關(guān)于列表的參考:

List
List Object

思考

現(xiàn)有一列表:

`a = [1, 3, 4, 0, 1, 5, 5, 1, 5, 1, 5, 6, 2, 3, 1, 5, 3]`

刪除所有 5 元素前面的 1热凹,同時(shí)在所有的 3 后添加 3 個(gè) 2

一種 Python 的思路

>>> a = [1, 3, 4, 0, 1, 5, 5, 1, 5, 1, 5, 6, 2, 3, 1, 5, 3]
>>> ','.join( [str(i) for i in a] ).replace('1,5', '5').replace('3', '3,2,2,2').split(',')
['1', '3', '2', '2', '2', '4', '0', '5', '5', '5', '5', '6', '2', '3', '2', '2', '2', '5', '3', '2', '2', '2']
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市泪电,隨后出現(xiàn)的幾起案子般妙,更是在濱河造成了極大的恐慌,老刑警劉巖相速,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碟渺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡突诬,警方通過(guò)查閱死者的電腦和手機(jī)止状,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)攒霹,“玉大人怯疤,你說(shuō)我怎么就攤上這事〈呤” “怎么了集峦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)屏镊,這世上最難降的妖魔是什么涕俗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮聪黎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘备恤。我一直安慰自己稿饰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布露泊。 她就那樣靜靜地躺著喉镰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惭笑。 梳的紋絲不亂的頭發(fā)上侣姆,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音沉噩,去河邊找鬼捺宗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛川蒙,可吹牛的內(nèi)容都是我干的偿凭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼派歌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼弯囊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起胶果,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤匾嘱,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后早抠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體霎烙,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蕊连,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悬垃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甘苍,死狀恐怖尝蠕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情载庭,我是刑警寧澤看彼,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布廊佩,位于F島的核電站,受9級(jí)特大地震影響靖榕,放射性物質(zhì)發(fā)生泄漏标锄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一茁计、第九天 我趴在偏房一處隱蔽的房頂上張望料皇。 院中可真熱鬧,春花似錦星压、人聲如沸践剂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拧簸,卻和暖如春劲绪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盆赤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工贾富, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牺六。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓颤枪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親淑际。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畏纲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容