在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ù)已經是元組葫松,就原封不動地返回它瓦糕。