序列概覽
在Python中最基本的數(shù)據(jù)結(jié)構(gòu)是序列(sequence)叁丧。序列共有6種類型,本章只重點(diǎn)討論兩種:列表和元組风纠。該章的大致結(jié)構(gòu)為:
- 通用序列操作
- 列表
- 元組
通用序列操作
所有的序列都能進(jìn)行某些特定的操作亚隙,并且Python還帶有計(jì)算長(zhǎng)度宾抓、尋找最大和最小元素等功能的內(nèi)建方法抑月。
索引
序列總所有的元素都是帶編號(hào)的树叽,0表示從第一位開始,-1表示從最后一位開始谦絮。字符串就是一個(gè)由字符組成序列:
>>> greeting = "Hello"
>>> greeting[0]
'H'
>>> "Hello"[-1]
'o'
接下來(lái)該書實(shí)例給了一個(gè)小程序菱皆。當(dāng)做練習(xí)個(gè)人簡(jiǎn)單把要求抽象一下,如果你也是同我一樣剛剛?cè)腴TPython可以試著自己編編看:
要求用戶輸入年挨稿、月(1-12)、日(1-31)京痢,然后按照形如:September 12th,2014 的格式輸出構(gòu)建的字符串奶甘。
如下是自己構(gòu)建的一段代碼以及相應(yīng)的輸入輸出結(jié)果:
year = raw_input("Year:")
month = raw_input("Month(1-12):")
day = raw_input("Day(1-31):")
monthes = [
"January",
"February",
"March",
"April",
"Ma",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
]
#此處個(gè)人對(duì)英文位數(shù)的后綴表示法理解有偏差
days = ['st', 'rd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th', 'th'];
print monthes[int(month) - 1] + ' ' + day + days[int(day) - 1] + ',' + year
執(zhí)行即可看到如下結(jié)果:
$ python sequencePractise.py
Year:2015
Month(1-12):1
Day(1-31):5
January 5th,2015
相比之教程上的代碼,有些東西是可以改進(jìn)的
(1)在英文表達(dá)習(xí)慣中第1-3的后綴是st祭椰、nd臭家、rd, 其余則是th疲陕。比如:1st、12nd钉赁、23rd蹄殃、15th。
(2)因?yàn)檫€沒(méi)有學(xué)習(xí)分支(if else)所以這里用了一個(gè)長(zhǎng)度為31的元組來(lái)用于后綴的使用你踩。在Python中可以使用數(shù)組的拼接(跟Java和JavaScript比起來(lái)是新鮮的東西)诅岩,如下:
days = ['st', 'nd', 'rd'] + 7*['th']+['st', 'nd', 'rd'] + 7*['th']+['st', 'nd', 'rd'] + 7*['th']+['st'] + ['st']
。
分片
分片簡(jiǎn)而言之就是指定開始索引带膜、結(jié)束索引吩谦,然后得到一個(gè)子序列的操作。因?yàn)镻ython提供的分片操作非常靈活膝藕,一個(gè)一個(gè)介紹未必繁瑣式廷,下面列出書中的例子“磐欤可以先看輸入猜測(cè)輸出滑废,再實(shí)際操作或者看結(jié)果來(lái)印證:
> numbers = [1,2,3,4,5,6,7,8,9,10]
> numbers[3:6]
[4, 5, 6] #注意索引為6的數(shù)字沒(méi)有算在內(nèi)
> numbers[-3:-1]
[8, 9]
> numbers[-3:0]
[] #第二個(gè)索引位置在第一個(gè)索引位置的前面
> numbers[-3:]
[8,9,10]
> numbers[:-3]
[1,2,3,4,5,6,7]
> numbers[:]
[1,2,3,4,5,6,7,8,9,10] # 結(jié)果相當(dāng)于復(fù)制整個(gè)序列
> numbers[0:10:2]
[1, 3, 5, 7, 9]#第三個(gè)參數(shù)為步長(zhǎng)
> numbers[8:3:-1]
[9, 8, 7, 6, 5]#步長(zhǎng)可以為負(fù)數(shù),索引大小也要反過(guò)來(lái)
> numbers[0:10:-2]
[]
> numbers[8::-2]
[9, 7, 5, 3, 1]
> numbers[5::-2]
[6, 4, 2]
> numbers[:5:-2]
[10,8]
#如上三個(gè)例子可以知道當(dāng)其中一個(gè)索引沒(méi)傳值的時(shí)候袜爪,會(huì)根據(jù)步長(zhǎng)的正負(fù)來(lái)設(shè)置默認(rèn)的索引值蠕趁。
并且注意:索引所指向的值不包含在切片結(jié)果中。
序列相加
> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
> "Hello" + " World"
"Hello World"
> "Hello" + [1,2,3]
#結(jié)果:error饿敲,序列是分類型的妻导,只有同類型的序列才能相加
乘法
數(shù)字乘以序列會(huì)生成一個(gè)新的序列,新序列中原先的內(nèi)容被重復(fù)若干次怀各。
> "Python"*3
"PythonPythonPython"
> [42]*5
[42, 42, 42, 42, 42]
是否包含成員
使用in運(yùn)算符可以檢測(cè)一個(gè)知道是否包含在序列中:
> permission = 'rw'
> 'w' in permission
True
> users = ['admin', 'root']
> raw_input('Enter your name:') in users
Enter your name:admin
True
長(zhǎng)度倔韭、最小值和最大值
>>> numbers = [823, 428, 105]
>>> len(numbers)
3
>>> max(numbers)
823
>>> min(numbers)
105
>>> max(6,3,9,5)
9 #max、min也可以傳入多個(gè)參數(shù)來(lái)獲取最大最小值
列表
列表是可變的瓢对,并且有很多有用的寿酌、專門的方法。
list函數(shù)
函數(shù)不只是能對(duì)字符串使用硕蛹,對(duì)所有類型的序列都能用醇疼。如下為根據(jù)字符串創(chuàng)建列表的例子:
>>> list("Hello")
['H', 'e', 'l', 'l', 'o']
基本的列表操作
列表是序列的一種,那么所有序列的操作都是用于列表法焰,不同在于列表可以改變秧荆,該部分介紹改變列表的方法:元素賦值、元素刪除埃仪、分片賦值乙濒、列表方法(并非所有列表方法都能改變列表)。
- 元素賦值
>>> x=[1,1,1]
>>> x[1]=2
>>> x
[1, 2, 1]
- 刪除元素
>>> names = ['John', 'Swift', 'Skylar']
>>> del names[1]
>>> names
['John', 'Skylar']
- 切片賦值
>>> name = list('Perl')
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']
>>> name = list('Perl')
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']
#在這里我們使用了不等長(zhǎng)的列表進(jìn)行切片替換。
>>> numbers = [1,5]
>>> numbers[1:1] = [2,3,4]
>>> numbers
[1, 2, 3, 4, 5]
#這里起到了插入新元素的作用
>>> numbers = [1,2,3,4,5]
>>> numbers[1:4]=[]
>>> numbers
[1, 5]
#這里起到了刪除元素的作用颁股。結(jié)合利用步長(zhǎng)么库、負(fù)數(shù)可以有更多花樣。
列表方法
- append
> [1,2,3].append(4)
[1,2,3,4]
- count
> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')
2
- extend
a = [1, 2, 3]
b = [4, 5, 6]
a.extend(b)
a
[1, 2, 3, 4, 5, 6]
#可以看到a發(fā)生了改變甘有,這是與直接使用a+b不同的诉儒。
當(dāng)然該方法可以有別的如下兩種替代辦法:
> a = a + b
> a[len(a):] = b
- index
['to', 'be', 'or', 'not', 'to', 'be'].index('or')
2
- insert
>>> numbers = [1, 2, 3, 4]
>>> numbers.insert(2, 'three')
>>> numbers
[1, 2, 'three', 3, 4]
如上操作也等價(jià)于切片操作:
>>> numbers[3:3]=['three']
- pop
>>> numbers = [1,2,3]
>>> numbers.pop()
3
>>> numbers
[1, 2]
實(shí)現(xiàn)棧這種結(jié)構(gòu)就可以通過(guò)結(jié)合使用(append和pop這兩個(gè)方法來(lái)實(shí)現(xiàn))。實(shí)現(xiàn)隊(duì)列的話亏掀,則可以通過(guò)給pop和append添加為0的下標(biāo)作為第一個(gè)參數(shù)忱反。
- remove
>>> x = ['to', 'be', 'or', 'not', 'to', 'be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']
如上移除的為第一個(gè)匹配項(xiàng)。
- reverse
>>> x = [1, 2, 3]
>>> x.reverse()
>>> x
[3, 2, 1]
- sort
>>> x = [4,7,2,1,7,9]
>>> x.sort()
>>> x
[1, 2, 4, 7, 7, 9]
該書在介紹如上絕大多數(shù)方法中都提到了(1)是否返回值(2)是否改變列表本身幌氮。個(gè)人覺(jué)得缺乏使用經(jīng)驗(yàn)之前想要記憶住這些東西沒(méi)有實(shí)際意義缭受,真正使用的時(shí)候通過(guò)命令行簡(jiǎn)單測(cè)驗(yàn)就可以知道。
- 高級(jí)排序
如果希望按照自己定義的規(guī)則對(duì)列表進(jìn)行排序该互,需要傳遞compare方法給sort米者,sort默認(rèn)使用的是內(nèi)建函數(shù)cmp(大于返回1,小于返回-1宇智,等于返回0)蔓搞。此處暫不詳細(xì)敘述,原理跟Java應(yīng)該是一樣的随橘。
>cmp(94, 39)
1
元組:不可變序列
如下列出了元組的常用表示法:
>1, 2, 3
(1, 2, 3)
>(1, 2, 3)
(1, 2, 3)
>()
()
> 42,
(42,)
> (42,) * 3
(42, 42, 42)
tuple函數(shù)
tuple是將序列轉(zhuǎn)化為元組的函數(shù)喂分,和列表總的list類似:
>>> tuple([1,2,3])
(1, 2, 3)
>>> tuple('hello')
('h', 'e', 'l', 'l', 'o')
元組基本操作
創(chuàng)建、訪問(wèn)机蔗、切片操作都和列表類似蒲祈。
元組存在的意義
一般來(lái)說(shuō),列表能夠滿足絕大多數(shù)的需要萝嘁。書中所提及元組存在的意義梆掸,現(xiàn)在還體會(huì)不深,暫且不管牙言。