解析python列表索引操作 切片操作的原理

2021-09-24 21:33:14 字數 3160 閱讀 5695

列表元素的獲取可以使用索引或者切片,這個時候呼叫的是__getitem__方法

a[i]

# 這是乙個簡單的數字索引,使用即元素「位置」獲取元素值

a[i:j]

;a[i:j:k]

# 這是切片操作,i為起始位置,j為結束位置,k為步進值

當使用賦值表示式對元素進行賦值時,呼叫的時__setitem__方法

a[0]

=10#也可以使用這樣的方法替換多個元素a[0

:2]=

[11,12

]

當使用del語句刪除乙個值時,呼叫的是__delitem__方法

del a[0]

del a[0,

2]

當使用類似於a[:],a[1:2],a[1,10,2]這樣的操作時,實際上是在寫slice表示式。slice表示式必須要有三個引數,即起始,結束和步進。之所以我們可以少寫引數,是因為內部使用了 indices 這個方法對引數進行了補全。

class

explore

(list):

def__getitem__

(self, item)

:print

(item,item.indices(

len(self)))

return

super()

.__getitem__(item)

>> a = explore(

'1234'

)>> a[:]

>>

slice

(none

,none

,none)(

0,4,

1)# 雖然我們傳入的表示式僅為乙個:,但是indices進行了補全

['1'

,'2'

,'3'

,'4'

]

當我們要使用繼承的方式實現自己的list,並且對其中的方法和操作進行自己的一些定義,那麼一定不要忘記slice。下面是乙個支援平均數和標準差方法的list。

class

statslist

(list):

def__init__

(self,

*args,

**kwargs)

: self.sum0 =

0# 列表中元素的個數,len(self)

self.sum1 =

0# 列表中所有元素的和, sum(self)

self.sum2 =

0# 列表中所有元素的平方和, sum(x**2 for x in self)

super()

.__init__(

*args,

**kwargs)

for x in self:

self._new(x)

# 當添入元素時呼叫

def_new

(self, value)

: self.sum0 +=

1 self.sum1 += value

self.sum2 += value * value

# 當移除元素時呼叫

def_rmv

(self, value)

: self.sum0 -=

1 self.sum1 -= value

self.sum2 -= value * value

definsert

(self, index, value)

:super()

.insert(index, value)

self._new(value)

defpop

(self, index=-1

):value =

super()

.pop(index)

self._rmv(value)

def__setitem__

(self, key, value)

:# 如果key是slice例項,那麼在進行切片賦值

ifisinstance

(key,

slice):

start, stop, step = key.indices(self.sum0)

for i in

range

(start, stop, step):

self._rmv(self[i]

)super()

.__setitem__(key, value)

# 這裡value不存在不可迭代的情況,因為 slice 操作引數必須為可迭代物件

for x in value:

self._new(x)

else

: self._rmv(self[key]

) self._new(value)

super()

.__setitem__(key, value)

def__delitem__

(self, key):if

isinstance

(key,

slice):

start, stop, step = key.indices(self.sum0)

for i in

range

(start, stop, step):

self._rmv(self[i]

)super()

.__delitem__(key)

else

: self._rmv(self[key]

)super()

.__delitem__(key)

""" """

# 平均數

@property

defmean

(self)

:return self.sum1 / self.sum0

# 標準差

@property

defstdev

(self)

:return math.sqrt(self.sum0 * self.sum2 - self.sum1 **2)

/ self.sum0

python列表推導式操作解析

這篇文章主要介紹了python列表推導式操作解析,文中通過示例 介紹的非常詳oaarjeiwy細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下 基本格式 表示式 for 變數 in 列表 或者 表示式 for 變數 in 列表 if 條件 例子 將a列表中大於5的數 10儲存到b...

python切片是什麼 python列表切片是什麼

我們基本上都知道python的序列物件都是可以用索引號來引用的元素的,索引號可以是正數由0開始從左向右,也可以是負數由 1開始從右向左。在python中對於具有序列結構的資料來說都可以使用切片操作,需注意的是序列物件某個索引位置返回的是乙個元素,而切片操作返回是和被切片物件相同型別物件的副本。如下面...

Python列表解析操作例項總結

python 的強大特性之一是其對 list 的解析,它提供一種緊湊的方法,可以通過對 list 中的每個元素應用乙個函式,從而將乙個 list 對映為另乙個 list。列表解析,又叫列表推導式 list comprehension 列表解析比 for 更精簡,執行更快,特別是對於較大的資料集合 列...