Python中的序列操作
Python中的序列操作
分類: python
undefined
官方手冊(cè):https://docs.python.org/3.7/library/stdtypes.html#sequence-types-list-tuple-range
序列簡(jiǎn)介
序列是指按照位置順序來(lái)存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),也就是說(shuō)能通過(guò)數(shù)值索引進(jìn)行操作。實(shí)際上,python對(duì)序列的解釋是:只要類型對(duì)象中重載了__len__()和__getitem__(),且它們的整數(shù)參數(shù)從0開(kāi)始,就表示這個(gè)類型滿足序列協(xié)議,是一個(gè)序列類型。
python有三種基本的序列類型:列表、元組和range對(duì)象。當(dāng)然,還有特別定制的序列類型:str和binary data。
序列類型又分為可變序列和不可變序列。可變序列表示可以原處修改的序列,不可變序列意味著不允許原處修改。例如,列表是可變序列,字符串是不可變序列。
可變對(duì)象和不可變對(duì)象的含義,參見(jiàn)python可變對(duì)象和不可變對(duì)象的解釋。
序列的通用操作
下面這些操作是序列通用的,無(wú)論是可變、不可變序列。但通用并不意味著所有序列都支持這些操作,有些特殊的序列因?yàn)槟承┰虿恢С帜承┎僮饕彩呛侠淼摹?/p>
注意:python中序列操作在索引越界的時(shí)候都會(huì)報(bào)錯(cuò)。
1.測(cè)試元素是否存在
x in S和x not in S,返回True或False。例如:
>>> 'a' in "abcd" True >>> 'aa' in "abcd" False >>> 'ab' in "abcd" True >>> 3 in [1,2,3,4] True2.加法和乘法符號(hào)
S1 + S2或S * N或N * S,其中S1和S2是同一種序列類型,N表示序列的重復(fù)次數(shù)。
例如:
>>> [1,2] + [3,4] [1, 2, 3, 4]>>> [1,2] * 3 [1, 2, 1, 2, 1, 2] >>> 3 * [1, 2] [1, 2, 1, 2, 1, 2]注意,序列中保存的是元素的引用地址,所以對(duì)于序列中的可變?cè)?#xff0c;+ *時(shí)需要注意修改的影響范圍:
>>> L = [1,2,3,4] >>> L1 = [['a'],['b']]>>> L0 = L + L1 >>> L0 [1, 2, 3, 4, ['a'], ['b']]>>> L1[0][0] = "aa" >>> L0 [1, 2, 3, 4, ['aa'], ['b']]上面修改"a"為"aa"也會(huì)影響到+的結(jié)果L0,因?yàn)閇'a']是一個(gè)可變對(duì)象。同樣對(duì)于*的重復(fù)操作,也是拷貝引用:
>>> L = [] >>> L1 = [L] * 3 >>> L1 [[], [], []]>>> L.append(3) >>> L1 [[3], [3], [3]]3.len()、max()和min()函數(shù)
len()返回序列的元素個(gè)數(shù),也就是序列的長(zhǎng)度。min()和max()分別返回序列中最小、最大的元素。
>>> len(L), min(L), max(L) (4, 'a', 'd')4.找出元素在序列中出現(xiàn)的次數(shù)count()
>>> s="hello world" >>> s.count("h"),s.count("o") (1, 2)5.索引取元素
S[i],i為從0開(kāi)始的數(shù)值,可以取負(fù)數(shù)表示從尾部開(kāi)始取。
例如:
>>> L ['a', 'b', 'c', 'd'] >>> L[0] 'a' >>> L[1] 'b' >>> L[-1] 'd'負(fù)數(shù)的i等價(jià)于len(S)+i作為索引。例如,len(S) = 3, i = -1,表示取最后一個(gè)元素,也就是index=2的元素。
6.分片
分片操作用于從序列中取出子序列,它會(huì)創(chuàng)建新的內(nèi)存塊來(lái)保存取出來(lái)的序列對(duì)象。
- S[i:j]:從索引位i取到索引位j,不包括j
- S[i:]:從索引位i開(kāi)始取到最結(jié)尾
- S[:j]:從最開(kāi)頭取到索引位j,不包括j
- S[:]:從頭取到尾,相當(dāng)于拷貝了序列,但得到的是新序列
- S[i:j:k]:k表示取元素時(shí)的步進(jìn)間隔,默認(rèn)為1,表示每個(gè)元素都取,如果為2,則表示取一個(gè)跳過(guò)一個(gè)
分片的區(qū)間是左閉右開(kāi)的,所以不會(huì)包括j的索引位。i和j可以是負(fù)數(shù),負(fù)數(shù)表示從尾部開(kāi)始計(jì)算索引位。例如,-1表示最后一個(gè)元素,-2表示倒數(shù)第二個(gè)元素。
特別地,如果i = j,則表示找到序列中的這個(gè)位置,但因?yàn)榍衅L(zhǎng)度位0,所以返回空。
例如:
>>> s = "hello world" >>> len(s) 11>>> s[0:6] 'hello ' >>> s[:6] 'hello '>>> s[6:10] # 不包括index=10 'worl' >>> s[6:11] # 所以用大于10的結(jié)束位 'world' >>> s[6:] 'world' >>> s[6:-1] 'worl'>>> s[:] # 拷貝序列得到副本 'hello world'>>> s[::1] # 步進(jìn)為1,默認(rèn)的 'hello world' >>> s[::2] # 每次跳過(guò)一個(gè)元素 'hlowrd'>>> s[1:1] # 找到index=1的位置 ''7.找出第一個(gè)元素的位置index()
index(x,i,j)表示從序列中搜索元素x并返回第一次出現(xiàn)的x的位置,如果給定了i,則表示從索引位i開(kāi)始搜索,給定了j則表示最多搜索到索引位為j的位置。
如果找不到元素,將報(bào)錯(cuò)。i和j可以是負(fù)數(shù),但無(wú)論它們是正數(shù)還是負(fù)數(shù),都是搜索的開(kāi)始和結(jié)束位。
>>> s="hello world" >>> s.index("o") 4 >>> s.index("o",1,-1) 4 >>> s.index("o",-5) # 從倒數(shù)第5個(gè)元素開(kāi)始搜索 7 >>> s.index("a") # 搜索不到時(shí)報(bào)錯(cuò) Traceback (most recent call last):File "<stdin>", line 1, in <module> ValueError: substring not found不可變序列的操作
相比可變序列,不可變序列的唯一操作是可以支持內(nèi)置的hash()操作。可變序列無(wú)法hash()。
>>> hash("asd") -2014632507>>> hash((1,23)) 1320437575>>> hash([1,23]) Traceback (most recent call last):File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'能夠hash的不可變序列,意味著能作為dict的key,能保存到set或frozenset中。
可變序列的操作
對(duì)于序列,還有一個(gè)內(nèi)置函數(shù)reversed(SEQ)。與之對(duì)應(yīng)的,還有一個(gè)內(nèi)置函數(shù)sorted(),但它操作的對(duì)象是可迭代對(duì)象,并不一定總是序列。
示例1:序列元素賦值
>>> L = ['aa','bb','cc','dd','ee','ff'] >>> L1 = [1,2,3,4]>>> L[0] = "a" >>> L ['a', 'bb', 'cc', 'dd', 'ee', 'ff']>>> L[1:2] = L1 >>> L ['a', 1, 2, 3, 4, 'cc', 'dd', 'ee', 'ff']>>> L[::2] = [1,2,3,4,5] >>> L [1, 1, 2, 3, 3, 'cc', 4, 'ee', 5]示例2:刪除元素
刪除相關(guān)操作有del、remove()、pop()、clear()。
例如:
>>> L = ['aa','bb','cc','dd','ee','ff'] >>> del L[1] >>> L ['aa', 'cc', 'dd', 'ee', 'ff'] >>> del L[1:2] >>> L ['aa', 'dd', 'ee', 'ff'] >>> del L[::2] >>> L ['dd', 'ff']>>> L = ['aa','bb','cc','dd','ee','ff'] >>> L.remove('aa') >>> L ['bb', 'cc', 'dd', 'ee', 'ff']>>> L.pop() 'ff' >>> L ['bb', 'cc', 'dd', 'ee']>>> L.pop(2) 'dd' >>> L ['bb', 'cc', 'ee']>>> L.clear() >>> L []示例3:添加元素
相關(guān)操作有append()、extend()、insert()、s *= n。
例如:
>>> L = ['aa', 'bb', 'cc', 'dd', 'ee'] >>> L1 = [1,2,3,4]>>> L.append("ff") >>> L ['aa', 'bb', 'cc', 'dd', 'ee', 'ff']>>> L.insert(1,"a") >>> L ['aa', 'a', 'bb', 'cc', 'dd', 'ee', 'ff']>>> L.extend(L1) >>> L ['aa', 'a', 'bb', 'cc', 'dd', 'ee', 'ff', 1, 2, 3, 4]>>> L1 * 2 [1, 2, 3, 4, 1, 2, 3, 4]示例4:其它操作
拷貝序列copy()、反轉(zhuǎn)序列reverse()。
>>> L = ['aa', 'bb', 'cc', 'dd', 'ee']>>> L1 = L.copy() >>> L1 ['aa', 'bb', 'cc', 'dd', 'ee']>>> L.reverse() >>> L ['ee', 'dd', 'cc', 'bb', 'aa']還有一個(gè)可用于序列的內(nèi)置函數(shù)reversed(),它反轉(zhuǎn)序列,并返回可迭代對(duì)象。所以,如果要將它展現(xiàn)出來(lái),需要構(gòu)建容器。例如:
>>> L = ['aa', 'bb', 'cc', 'dd', 'ee']>>> list(reversed(L)) ['ee', 'dd', 'cc', 'bb', 'aa']>>> set(reversed(L)) {'aa', 'bb', 'ee', 'cc', 'dd'}總結(jié)
以上是生活随笔為你收集整理的Python中的序列操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Python生成readme文件】——
- 下一篇: 【python基础】——数据类型(列表、