第2章 列表和元組

第2章 列表和元組

在Python中量蕊,最基本的數(shù)據結構為序列(sequence)起暮。序列中的每個元素都有編號丹禀,即其位置或索引,其中第一個元素的索引為0鞋怀,第二個元素的索引為1双泪,依此類推。同時可回繞到序列末尾密似,用負索引表示序列末尾元素的位置焙矛。本章介紹一些通用的操作。

2.1 序列概述

列表和元組的主要不同在于残腌,列表是可以修改的村斟,而元組不可以。

列表中抛猫,所有元素都放在方括號內蟆盹,并用逗號隔開。類似于其他語言的數(shù)組了闺金。序列中還可以包含其他序列逾滥。

2.2 通用的序列操作

2.2.1 索引

序列中的所有元素都有編號——從0開始遞增。

>>> greeting = 'Hello' 
>>> greeting[0]
H

字符串就是由字符組成的序列败匹。不同于其他一些語言寨昙,Python沒有專門用于表示字符的類型讥巡,因此一個字符就是只包含一個元素的字符串。

當使用負數(shù)索引時舔哪,Python將從右往左數(shù)欢顷,-1是最后一個元素的位置。

對于字符串字面量(以及其他的序列字面量) 捉蚤,可直接對其執(zhí)行索引操作抬驴,無需先將其賦給變量。這與先賦給變量再對變量執(zhí)行索引操作的效果是一樣的缆巧。

>>>'Hello'[1]
'e'

2.2.2 切片

切片可以訪問特定范圍內的元素布持。切片使用兩個索引,并用冒號分隔盅蝗。區(qū)間是左閉右開鳖链。

如果第一個索引指定的元素位于第二個索引指定的元素后面姆蘸,結果就為空序列墩莫。即使index越界也不報錯,只返回空序列逞敷。

一種簡寫:如果切片結束于序列末尾狂秦,可省略第二個索引;如果切片始于序列開頭推捐,可省略第一個索引裂问。要復制整個序列,可將兩個索引都省略牛柒。

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[-3:] 
[8, 9, 10]
>>> numbers[:3] 
[1, 2, 3]
>>> numbers[:] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

切片操作中有另一個參數(shù)堪簿,即步長。普通切片中步長為1皮壁,如果指定步長大于1椭更,可以跳過一些元素。步長不能為0蛾魄,但可以為負數(shù)虑瀑,即從右向左提取元素。步長為負數(shù)時滴须,第一個索引必須比第二個索引大舌狗。

2.2.3 序列相加

可使用加法運算符來拼接序列。一般而言扔水,不能拼接不同類型的序列痛侍。

>>> [1, 2, 3] + [4, 5, 6] 
[1, 2, 3, 4, 5, 6] 
>>> 'Hello,' + 'world!' 
'Hello, world!' 
# >>> [1, 2, 3] + 'world!' 不能拼接
>>> [1,'hello']+['world']
[1, 'hello', 'world']

2.2.4 乘法

將序列與數(shù)x相乘時,將重復這個序列x次來創(chuàng)建一個新序列魔市。

空列表是使用不包含任何內容的兩個方括號[]表示的恋日。None表示什么都沒有(None必須是大寫)膀篮。
要將列表的長度初始化為10,可像下面這樣做:

>>> sequence = [None] * 10 
>>> sequence 
[None, None, None, None, None, None, None, None, None, None]

2.2.5 成員資格

要檢查特定的值是否包含在序列中岂膳,可使用運算符in誓竿。返回值為布爾值。
字符串的檢查也可以用in谈截,且單獨字符和子串都可以用于判斷筷屡。

內置函數(shù)len、min和max很有用簸喂,其中函數(shù)len返回序列包含的元素個數(shù)毙死,而min和max分別返回序列中最小和最大的元素。

2.3 列表:Python 的主力

2.3.1 函數(shù) list

為此喻鳄,可使用函數(shù)list創(chuàng)建字符串的列表扼倘。

>>> list('Hello') 
['H', 'e', 'l', 'l', 'o']

2.3.2 基本的列表操作

1.修改列表:給元素賦值

修改列表可以用普通賦值語句直接給指定索引位置元素賦值。

2.刪除元素

使用del語句

>>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl'] 
>>> del names[2] 
>>> names 
['Alice', 'Beth', 'Dee-Dee', 'Earl']

3.給切片賦值

通過切片可以同時給多個元素賦值除呵,并且可以將切片帖換位為長度與其不同的序列

>>> name = list('Perl')
>>> name ['P', 'e', 'r', 'l']
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']

使用切片賦值還可在不替換原有元素的情況下插入新元素再菊。也可以反過來刪除切片。

>>> numbers = [1, 5]
>>> numbers[1:1] = [2, 3, 4]
>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:4] = [] 
>>> numbers 
[1, 5]

2.3.3 列表方法

1.append

方法append用于將一個對象附加到列表末尾

>>> lst = [1, 2, 3] 
>>> lst.append(4) 
>>> lst 
[1, 2, 3, 4]

append直接修改原有列表颜曾,不會返回創(chuàng)建新列表纠拔。

2.clear

方法clear就地清空列表的內容。這類似于切片賦值語句lst[:] = []泛豪。

3.copy

方法copy復制列表稠诲。常規(guī)復制只是將另一個名稱關聯(lián)到列表。copy類似于使用a[:]或list(a)诡曙,它們也都復制臀叙。

>>> a = [1, 2, 3]
>>> b = a
>>> b[1] = 4
>>> a
[1, 4, 3]
>>> b = a.copy()
>>> b[1] = 2
>>> a
[1, 4, 3]
>>> b
[1, 2, 3]
>>> c = b[:]
>>> c[1] = 4
>>> c
[1, 4, 3]
>>> b
[1, 2, 3]

4.count

方法count計算指定的元素在列表中出現(xiàn)了多少次。

>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]] 
>>> x.count(1) 
2 
>>> x.count([1, 2]) 
1

5.extend

方法extend讓你能夠同時將多個值附加到列表末尾价卤。類似于列表拼接劝萤,但是常規(guī)拼接是返回一個新的序列。

常規(guī)拼接必須使用a和b的副本創(chuàng)建一個新列表荠雕,因此如果你要獲得類似于下面的效果稳其,拼接的效率將比extend低。

>>> a = a + b

以下方法雖然可行炸卑,但是可讀性不高既鞠。

>>> a = [1, 2, 3] 
>>> b = [4, 5, 6] 
>>> a[len(a):] = b 
>>> a 
[1, 2, 3, 4, 5, 6]

6.index

方法index在列表中查找指定值第一次出現(xiàn)的索引。

>>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni'] 
>>> knights.index('who') 
4

7.insert

方法insert用于將一個對象插入列表盖文。

>>> numbers = [1, 2, 3, 5, 6, 7] 
>>> numbers.insert(3, 'four') 
>>> numbers 
[1, 2, 3, 'four', 5, 6, 7]

8.pop

方法pop從列表中刪除一個元素(末尾為最后一個元素)嘱蛋,并返回這一元素。
pop是唯一既修改列表又返回一個非None值的列表方法。

>>> x = [1, 2, 3] 
>>> x.pop() 
3 
>>> x [1, 2] 
>>> x.pop(0) 
1 
>>> x 
[2]

append和pop可以實現(xiàn)

insert(0,...)替代append可以實現(xiàn)隊列
append和pop(0)也可以洒敏。更好的解決方案是使用collections中的deque龄恋。

9.remove

方法remove用于刪除第一個為指定值的元素。

>>> x = ['to', 'be', 'or', 'not', 'to', 'be'] 
>>> x.remove('be') 
>>> x 
['to', 'or', 'not', 'to', 'be']

10.reverse

方法reverse按相反的順序排列列表中的元素凶伙。reverse修改列表郭毕,但不返回任何值(與remove和sort等方法一樣)。

11.sort

方法sort用于對列表就地排序函荣。

函數(shù)sorted返回值是一個列表显押。

12.高級排序

方法sort接受兩個可選參數(shù):key和reverse。

>>> x = ['aardvark', 'abalone', 'acme', 'add', 'aerate'] 
>>> x.sort(key=len) 
>>> x 
['add', 'acme', 'aerate', 'abalone', 'aardvark']

對于另一個關鍵字參數(shù)reverse傻挂, 只需將其指定為true乘碑,以指出是否要按相反的順序對列表進行排序。

>>> x = [4, 6, 2, 1, 7, 9] 
>>> x.sort(reverse=True) 
>>> x 
[9, 7, 6, 4, 2, 1]

2.4 元組:不可修改的序列

與列表一樣金拒,元組也是序列兽肤,唯一的差別在于元組是不能修改的。(字符串也不能修改)

元組語法很簡單绪抛,只要將一些值用逗號分隔资铡,就能自動創(chuàng)建一個元組。元組還可用圓括號括起(這也是通常采用的做法)睦疫。

>>> 1, 2, 3 
(1, 2, 3)
>>> (1, 2, 3) 
(1, 2, 3)

空元組用兩個不包含任何內容的圓括號表示害驹。

>>> () 
()

一個值的元組需要在值后加逗號鞭呕。

>>> 42, 
(42,)

函數(shù)tuple的工作原理與list很像:它將一個序列作為參數(shù)蛤育,并將其轉換為元組。如果參數(shù)已經是元組葫松,就原封不動地返回它瓦糕。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腋么,隨后出現(xiàn)的幾起案子咕娄,更是在濱河造成了極大的恐慌,老刑警劉巖珊擂,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圣勒,死亡現(xiàn)場離奇詭異,居然都是意外死亡摧扇,警方通過查閱死者的電腦和手機圣贸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扛稽,“玉大人吁峻,你說我怎么就攤上這事。” “怎么了用含?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵矮慕,是天一觀的道長。 經常有香客問我啄骇,道長痴鳄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任缸夹,我火速辦了婚禮夏跷,結果婚禮上,老公的妹妹穿的比我還像新娘明未。我一直安慰自己槽华,他們只是感情好,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布趟妥。 她就那樣靜靜地躺著猫态,像睡著了一般。 火紅的嫁衣襯著肌膚如雪披摄。 梳的紋絲不亂的頭發(fā)上亲雪,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音疚膊,去河邊找鬼义辕。 笑死,一個胖子當著我的面吹牛寓盗,可吹牛的內容都是我干的灌砖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼傀蚌,長吁一口氣:“原來是場噩夢啊……” “哼基显!你這毒婦竟也來了?” 一聲冷哼從身側響起善炫,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤撩幽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后箩艺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窜醉,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年艺谆,在試婚紗的時候發(fā)現(xiàn)自己被綠了榨惰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡擂涛,死狀恐怖读串,靈堂內的尸體忽然破棺而出聊记,到底是詐尸還是另有隱情,我是刑警寧澤恢暖,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布排监,位于F島的核電站,受9級特大地震影響杰捂,放射性物質發(fā)生泄漏舆床。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一嫁佳、第九天 我趴在偏房一處隱蔽的房頂上張望挨队。 院中可真熱鬧,春花似錦蒿往、人聲如沸盛垦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腾夯。三九已至,卻和暖如春蔬充,著一層夾襖步出監(jiān)牢的瞬間蝶俱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工饥漫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留榨呆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓庸队,卻偏偏與公主長得像积蜻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子皿哨,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容