列表元素的獲取可以使用索引或者切片,這個時候呼叫的是__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 更精簡,執行更快,特別是對於較大的資料集合 列...