Python中的序列操作

Python中的序列操作

分類: python

undefined

官方手冊:https://docs.python.org/3.7/library/stdtypes.html#sequence-types-list-tuple-range

序列簡介

序列是指按照位置順序來存儲數據的數據結構,也就是說能通過數值索引進行操作。實際上,python對序列的解釋是:只要類型對象中重載了__len__()__getitem__(),且它們的整數參數從0開始,就表示這個類型滿足序列協議,是一個序列類型。

python有三種基本的序列類型列表、元組和range對象。當然,還有特別定制的序列類型:str和binary data

序列類型又分為可變序列和不可變序列。可變序列表示可以原處修改的序列,不可變序列意味著不允許原處修改。例如,列表是可變序列,字符串是不可變序列。

可變對象和不可變對象的含義,參見python可變對象和不可變對象的解釋。

序列的通用操作

下面這些操作是序列通用的,無論是可變、不可變序列。但通用并不意味著所有序列都支持這些操作,有些特殊的序列因為某些原因不支持某些操作也是合理的。

注意:python中序列操作在索引越界的時候都會報錯。

1.測試元素是否存在

x in Sx not in S,返回True或False。例如:

>>> 'a' in "abcd"
True
>>> 'aa' in "abcd"
False
>>> 'ab' in "abcd"
True
>>> 3 in [1,2,3,4]
True

2.加法和乘法符號

S1 + S2S * NN * S,其中S1和S2是同一種序列類型,N表示序列的重復次數。

例如:

>>> [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]

注意,序列中保存的是元素的引用地址,所以對于序列中的可變元素,+ *時需要注意修改的影響范圍:

>>> 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"也會影響到+的結果L0,因為['a']是一個可變對象。同樣對于*的重復操作,也是拷貝引用:

>>> L = []
>>> L1 = [L] * 3
>>> L1
[[], [], []]>>> L.append(3)
>>> L1
[[3], [3], [3]]

3.len()、max()和min()函數

len()返回序列的元素個數,也就是序列的長度。min()和max()分別返回序列中最小、最大的元素。

>>> len(L), min(L), max(L)
(4, 'a', 'd')

4.找出元素在序列中出現的次數count()

>>> s="hello world"
>>> s.count("h"),s.count("o")
(1, 2)

5.索引取元素

S[i],i為從0開始的數值,可以取負數表示從尾部開始取。

例如:

>>> L
['a', 'b', 'c', 'd']
>>> L[0]
'a'
>>> L[1]
'b'
>>> L[-1]
'd'

負數的i等價于len(S)+i作為索引。例如,len(S) = 3, i = -1,表示取最后一個元素,也就是index=2的元素。

6.分片

分片操作用于從序列中取出子序列,它會創建新的內存塊來保存取出來的序列對象

  • S[i:j]:從索引位i取到索引位j,不包括j
  • S[i:]:從索引位i開始取到最結尾
  • S[:j]:從最開頭取到索引位j,不包括j
  • S[:]:從頭取到尾,相當于拷貝了序列,但得到的是新序列
  • S[i:j:k]:k表示取元素時的步進間隔,默認為1,表示每個元素都取,如果為2,則表示取一個跳過一個

分片的區間是左閉右開的,所以不會包括j的索引位。i和j可以是負數,負數表示從尾部開始計算索引位。例如,-1表示最后一個元素,-2表示倒數第二個元素。

特別地,如果i = j,則表示找到序列中的這個位置,但因為切片長度位0,所以返回空。

例如:

>>> s = "hello world"
>>> len(s)
11>>> s[0:6]
'hello '
>>> s[:6]
'hello '>>> s[6:10]   # 不包括index=10
'worl'
>>> s[6:11]   # 所以用大于10的結束位
'world'
>>> s[6:]
'world'
>>> s[6:-1]
'worl'>>> s[:]      # 拷貝序列得到副本
'hello world'>>> s[::1]     # 步進為1,默認的
'hello world'
>>> s[::2]     # 每次跳過一個元素
'hlowrd'>>> s[1:1]    # 找到index=1的位置
''

7.找出第一個元素的位置index()

index(x,i,j)表示從序列中搜索元素x并返回第一次出現的x的位置,如果給定了i,則表示從索引位i開始搜索,給定了j則表示最多搜索到索引位為j的位置。

如果找不到元素,將報錯。i和j可以是負數,但無論它們是正數還是負數,都是搜索的開始和結束位。

>>> s="hello world"
>>> s.index("o")
4
>>> s.index("o",1,-1)
4
>>> s.index("o",-5)    # 從倒數第5個元素開始搜索
7
>>> s.index("a")       # 搜索不到時報錯
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ValueError: substring not found

不可變序列的操作

相比可變序列,不可變序列的唯一操作是可以支持內置的hash()操作。可變序列無法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中。

可變序列的操作

  1. s[i] = xs[i:j] = t將序列中的元素替換成x或可迭代對象t
  2. s[i:j:K] = t將序列中的元素替換成可迭代對象t,t的長度必須和s[i:j:k]的長度一樣
  3. del s[i]del s[i:j]刪除序列中的元素,等價于s[i] = []s[i:j] = []
  4. del s[i:j:k]刪除序列中的某些元素,k為步進值
  5. s.remove(x):移除第一次出現的元素x
  6. s.clear()表示清空序列中的所有元素,等價于del s[:]
  7. s.pop([i])表示移除序列s中的第i個元素并返回這個元素,中括號表示可選,如果沒有參數,默認移除最后一個元素
  8. s.append(x)向序列的尾部追加元素x,等價于s[len(s):len(s)] = [x]
  9. s.extend(t)s += t表示將t擴展到序列s的尾部,等價于s[len(s):len(s)] = t
  10. s.insert(i,x)表示將x插入到序列中的i索引位置處,等價于s[i:i] = [x]
  11. s *= n表示將序列n的元素重復n次追加到s的尾部
  12. s.copy()表示拷貝序列得到一個新的序列副本,等價于s[:]
  13. s.reverse()原地反轉序列s,為了節約內存空間,所以是原地反轉,不會返回反轉后的序列

對于序列,還有一個內置函數reversed(SEQ)。與之對應的,還有一個內置函數sorted(),但它操作的對象是可迭代對象,并不一定總是序列。

示例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:刪除元素

刪除相關操作有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:添加元素

相關操作有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()、反轉序列reverse()。

>>> L = ['aa', 'bb', 'cc', 'dd', 'ee']>>> L1 = L.copy()
>>> L1
['aa', 'bb', 'cc', 'dd', 'ee']>>> L.reverse()
>>> L
['ee', 'dd', 'cc', 'bb', 'aa']

還有一個可用于序列的內置函數reversed(),它反轉序列,并返回可迭代對象。所以,如果要將它展現出來,需要構建容器。例如:

>>> L = ['aa', 'bb', 'cc', 'dd', 'ee']>>> list(reversed(L))
['ee', 'dd', 'cc', 'bb', 'aa']>>> set(reversed(L))
{'aa', 'bb', 'ee', 'cc', 'dd'}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255878.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255878.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255878.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

automaticallyAdjustsScrollViewInsets的作用

簡單點說就是automaticallyAdjustsScrollViewInsets根據按所在界面的status bar&#xff0c;navigationbar&#xff0c;與tabbar的高度&#xff0c;自動調整scrollview的 inset,設置為no&#xff0c;不讓viewController調整&#xff0c;我們自己修改布局即可~轉載于:https://ww…

JavaScript 基礎知識 - BOM篇

前言 本篇文章是JavaScript基礎知識的BOM篇&#xff0c;如果前面的《JavaScript基礎知識-DOM篇》看完了&#xff0c;現在就可以學習BOM了。 注意&#xff1a; 所有的案例都在這里鏈接: 提取密碼密碼: yvxo&#xff0c;文章中的每個案例后面都有對應的序號。 1. BOM 基本概念 B…

全球首例機器人自殺事件 因受夠無聊家務

據鳳凰網,一個奧地利家庭購買一小機器人,每天工作就是倒垃圾、倒垃圾。一天完工后,它竟自己啟動,爬到爐邊&#xff0c;推開上面的鍋&#xff0c;把自己活活燒死…專家稱這個機器人實在受夠了無聊的家務瑣事&#xff0c;才毅然選擇自殺機器人也是有尊嚴的!為這有骨氣的robot點根…

【python基礎】——數據類型(列表、字典、集合)

駿馬金龍——python語法基礎 python基礎 變量與運算 符號//%**意義整除整除取余冪次方數據種類 #mermaid-svg-7nSRRijcYFCYwTDr .label{font-family:trebuchet ms, verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-7nSRRijcYFCYw…

linux命令:mkdir命令

命令參數&#xff1a; -m, --mode模式&#xff0c;設定權限<模式> (類似 chmod)&#xff0c;而不是 rwxrwxrwx 減 umask -p, --parents 可以是一個路徑名稱。此時若路徑中的某些目錄尚不存在,加上此選項后,系統將自動建立好那些尚不存在的目錄,即一次可以建立多個目錄; …

js設置奇偶行數樣式

$(document).ready(function () {odd { "background": "none" }; //奇數樣式 even { "background": "#f3f3f3" }; //偶數樣式 odd_even(".gys_xq", odd, even);});function odd_even(id, odd, even) {$(id).find("…

貝塞爾曲線切割圓角

ios 系統框架已經給我們提供了相應的切割圓角的方法, 但是如果在一個見面有很多控件切割的話會出現卡頓和個別不切的現象 ?123456789101112131415161718192021222324252627/* 創建一個Button */UIButton * button [UIButton buttonWithType:(UIButtonTypeSystem)];[button se…

機器人實現屠宰自動化

當 WESTFLEISCH 注冊合作社考慮在 Coesfeld 肉類加工中心內自動化原有的人工屠宰設備過程時&#xff0c;首先在“剔除直腸”及“切開盆腔骨及腹部”兩個流程中測試使用了兩臺庫卡機器人。在此過程中&#xff0c;機器人主要以它工作的質量及經濟效益說服了使用者。 實施措施/解…

DOM編程藝術12章

在submit.html中&#xff0c;代碼簡略成如下也行 <article><h1>Thanks!</h1><p>Thanks for contacting us. Well get back to you as soon as we can.</p></article> </body> </html> 說明了只是插入article的部分&#xff0c…

python數據結構《排序專題復習》

目錄 常見的三種排序方法 冒泡排序 插入排序 選擇排序 其他經典的排序方法 快速排序 堆排序 歸并排序 希爾排序 不同排序方法的各維度對比 排序方式的穩定性&#xff1a;若兩個相同的元素在排序前后的相對位置不發生改變的排序為穩定排序&#xff0c;否則不穩定排序 常…

BZOJ2844 albus就是要第一個出場

AC通道&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id2844 這題貌似HDU上有一道差不多的題&#xff0c;不過我沒做過&#xff0c;也就沒管了。 首先講一個線性基的東西&#xff0c;大概就是這樣&#xff1a; 然后就是一個什么性質&#xff1a;S異或起來會出現重…

HTG Explains: Why Linux Doesn’t Need Defragmenting

If you’re a Linux user, you’ve probably heard that you don’t need to defragment your Linux file systems. You’ll also notice that Linux distributions don’t come with disk-defragmenting utilities. But why is that? To understand why Linux file systems d…

Spring AOP 實戰運用

Spring AOP 實戰 看了上面這么多的理論知識, 不知道大家有沒有覺得枯燥哈. 不過不要急, 俗話說理論是實踐的基礎, 對 Spring AOP 有了基本的理論認識后, 我們來看一下下面幾個具體的例子吧.下面的幾個例子是我在工作中所遇見的比較常用的 Spring AOP 的使用場景, 我精簡了很多有…

VC Ws2_32.lib

該庫對應WS2_32.DLL&#xff0c;提供了對以下網絡相關API的支持&#xff0c;若使用其中的API&#xff0c;則應該將ws2_32.lib加入工程&#xff08;否則要動態載入WS2_32.DLL&#xff09;。acceptbindcloseSOCKETconnectgetpeernamegetsocknamegetsockopthtonlhtonsioctlsocketi…

大話設計模式之策略模式

第二章&#xff1a;商場促銷——策略模式 策略模式的定義:策略模式是一種定義一系列算法的方法&#xff0c;從概念上來看&#xff0c;所有這些算法完成的都是相同的工作&#xff0c;知識實現不同&#xff0c;他可以以相同的方式調用所有的算法&#xff0c;減少了各類算法類與使…

【Python學習】——語言風格(變量賦值、深淺拷貝、for循環陷阱)

目錄 1、賦值 2、賦值的分類——引用賦值、值賦值 1) 不可變對象引用賦值——字符串、數值、元組等 2&#xff09;可變對象引用賦值——列表、集合、字典 3&#xff09;可變與不可變對象的引用賦值內部分析 4&#xff09;在py文件中&#xff0c;和作用域有關&#xff0c;如…

underscore.js 頁面數據渲染

1.underscore.js 源碼 // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license.(function() {// …

判斷莊家是否出貨

1. 大盤處于強勢的時候 日平均線在橫盤的時候&#xff0c;緩慢拉升然后急劇下跌 高位盤整的時候 2. 有利好消息發布的時候 因為莊家會利用這個對于散戶來說這個買入時機來進行出貨操作&#xff0c;可見莊家真是陰險狡詐轉載于:https://www.cnblogs.com/dcz1001/p/6115893.html

【深度學習】——常見深度學習模型總結、anchor-free和anchor-based

目錄 1、faster rcnn&#xff1a; 2、SSD&#xff1a; 3、YOLOv1: 小結&#xff1a; 拓展&#xff1a;anchor-based和anchor-free anchor 1、faster rcnn&#xff1a; FasterRcnn 算法原理講解筆記&#xff08;非常詳細&#xff09;https://blog.csdn.net/xjtdw/article…

PHP PDO函數庫詳解

PDO是一個“數據庫訪問抽象層”&#xff0c;作用是統一各種數據庫的訪問接口&#xff0c;與mysql和mysqli的函數庫相比&#xff0c;PDO讓跨數據庫的使用更具有親和力&#xff1b;與ADODB和MDB2相比&#xff0c;PDO更高效。目前而言&#xff0c;實現“數據庫抽象層”任重而道遠&…