Python3之字串str、列表list、元組tuple的切片操作

geek_xiong發表於2018-09-01

切片操作slice

首先要明確一點:字串和元組是不可變的可迭代物件,列表是可變的可迭代物件
對於可變不可變,就引起了能否賦值的問題
例如:

>>> s = [1,2,3]  # 列表  可變
>>> s[0] = 100
>>> s
[100, 2, 3]

>>> a = (1,2,3)  # 元組  不可變
>>> a[0]
1
>>> a[0]=100
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a[0]=100
TypeError: 'tuple' object does not support item assignment

>>> b = 'helloworld'  # 字串  不可變
>>> b[0]
'h'
>>> b[0]=k
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    b[0]=k
NameError: name 'k' is not defined

以上是索引賦值,索引都不能賦值的,切片就也不能賦值了,好了,進入正題吧

切片的定義

從序列中取出相應的元素重新組合成一個新的序列

語法

s[(開始索引b):(結束索引e):(步長s)]

說明

  1. 切片切下的位置:0 代表第一個元素,-1代表最後一個元素
  2. 結束索引是切片的終止索引(但不包括終止點)
  3. 步長是切片每次獲取完當前元素後移動的偏移量
    3.1. 步長預設為 1
    3.2. 當步長是正數時,取正向切片,開始索引預設為 0 ,結束索引為最後一個元素的下一個位置
    3.3. 當步長為負數時,取反向切片,開始預設為最後一個,結束位置是第一個的前一個

舉個栗子:

>>> s = 'helloworld'
>>> s[2]
'l'
>>> s[2:3]  # 索引從2開始,到3的前一個結束
'l'
>>> s[0:5:2]
'hlo'
>>> s[0:5:-2]  # 為什麼呢? 步長為負,開始索引必須大於終止索引才有資料讓我們切啊!!
''
>>> s[5:0:-2]
'wle'

>>> s = [1,2,3,4,56,7]
>>> s[2::2]
[3, 56]

>>> s = (1,2,3,4,5,6)
>>> s[2::2]
(3, 5)

切片賦值

切片賦值只對可變序列有效,即只有列表了
舉個栗子:

# 此示例示意字串的切片賦值
>>> s = 'hello world'
>>> s[1:2] = 'w'
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    s[1:2] = 'w'
TypeError: 'str' object does not support item assignment

很明顯,失敗了

# 此示例示意元組的切片賦值
>>> s = (1,2,3,5,6,3)
>>> s[1:2]=123
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    s[1:2]=123
TypeError: 'tuple' object does not support item assignment

我們不難發現,錯誤資訊和字串是相同的,再看列表怎麼樣

>>> s = [1,2,3,4,5,6]
>>> s[1:2]=100  # 看報錯資訊是讓賦值可迭代物件,但字串和元組直接就是不讓賦值
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    s[1:2]=100
TypeError: can only assign an iterable
>>> s[1:2]=[100000]
>>> s
[1, 100000, 3, 4, 5, 6]

在列表開始位置插入資料

>>> s = [1,2,3]
>>> s[0:0]=[123]
>>> s
[123, 1, 2, 3]

如果是[0:1]會是什麼效果呢?

>>> s = [1,2,3]
>>> s[0:1]=[123]
>>> s
[123, 2, 3]

這樣就把索引為 0 的元素給替換掉了

在指定索引處插入資料

>>> s = [1,2,3]
>>> s[1:1] = [222222]  # 在索引為  1  的位置插入資料
>>> s
[1, 222222, 2, 3]

在最後插入資料

>>> s = [1,2,3]
>>> s[len(s):] = [111]
>>> s
[1, 2, 3, 111]

因為我們不知道這個列表到底有多長,可以先計算其長度,再賦值

本節完

相關文章