python之list操作

         list作爲常用的數據結構之一,今天就其使用進行簡單的總結:

(1)增

》append:

s1 = [1,2,3]
s2 = [4]
s1.append(s2)
s1.append({'1':'2'})
print(s1)

輸出如下

[1,2,3,[4],{'1':'2'}]

使用append相當把整個s2當做List中的元素的內容,相當於把[s2]添加到了s1中。如果用print(s1.append(s2))輸出的爲None;用test =s1.append(s2)在print(s2)得到還是None,因爲append操作是在原List上的修改,不會返回一個新的值
append 操作可以向List中添加任何元素,比如字典,不過字典整體作爲List中的一個元素(比如上面字典的{})
》+運算:

s1 = [1,2,3]
s2 = [4]
print(s1+s2)

結果如下

[1,2,3,4]


+運算是對於兩個類型相同的變量之間的運算,不改變原有的變量,並返回一個新的值,是內容之間的拼接

》extend:

s1 = [1,2,3]
s2 = [4]
s1.extend(s2)
print(s1)
s3 = 'abc'
s1.extend(s3))
print(s1)
s4 = {'age':12,'height':180}
s1.extend(s4)
print(s1)

輸出如下:

[1, 2, 3, 4]
[1, 2, 3, 4, 'a', 'b', 'c']
[1, 2, 3, 4, 'a', 'b', 'c', 'height', 'age']

extend 也是在原有List上進行修改,沒有返回值,可以擴展不同類型的變量,並將其內容以List變量的形式加入到原List中。
從輸出中可見如果extend的是字符串,則字符串會被拆分成字符數組,如果extend的是字典,則字典的key會被加入到List中。

(2)刪

 tmp = [1,2,3]

以tmp爲例,刪除操作有如下幾種,

》remove(val)

tmp.remove(1)
print(tmp)  ###[2,3]
  • remove() 的參數是具體的元素值,而不是索引,
  • 如果知道索引,使用 remove 刪除該索引上的元素值。

》pop

tmp.pop(-1)
print(tmp) ##[1,2]
  • pop() 接收的是索引,無參的情況下刪除的是最後一個元素,等價於pop(-1)(典型的棧的特性)
  • pop() 存在返回值,返回的是刪除的元素值
  • list 的 append()(添加到尾部),pop()(從尾部彈出),成功地將 list 變成了 stack

》del

del(tmp[0]) ###[2,3]

補:去除list中的某個元素(可能存在重複)

###先去重再刪除元素
tmp=[1,2,2,3]
tt=list(set(tmp))
for i in tt:
    if i==2:
        tt.remove(i)
print(tt)

###直接去除,注意這裏while循環換成for循環後會出現刪除不乾淨或溢出錯誤
tmp=[1,2,2,3]
i=0
while i<len(tmp):
    if tmp[i]==2:
        tmp.remove(tmp[i])
        i-=1   ##回退一步,保證去除所有重複元素
    i+=1
print(i)

(3)改

       相對而言,list聲明後結構大體分爲3部分,變量名稱--list對象(結構性數據+指針數組)--list內容,其中id表示的是list對象的位置,想要修改指定位置元素,可以通過下標進行索引,然後進行修改。如下,

tmp=[1,2,"23","34"]
tmp[2]=3  ##[1,2,3,"34"]

需要注意的是

a=b時,a和b指向同一個list對象

a=b[:]時,a的list對象和b的list對象指向同一個list內容

(4)查
       由於list內置了iter函數,是可迭代對象,因此可以通過循環來實現對list內元素的遍歷審查,需要注意的一點就是list嵌套情況處理,示例如下,

def printList(list1):
    res=[]
    for elements in list1:
        if isinstance(elements,list) or isinstance(elements, tuple):
            tt=printList(elements) #遞歸調用函數本身進行深層次的遍歷
            res.extend(tt)
        elif isinstance(elements, dict): #由於dict類型中的鍵值key必須唯一,所以只能是不可變類型數據,所以這裏不存在深層遍歷dict鍵值的問題。
            for i in elements.items():
                res.extend(i)
        else :
            res.append(elements)
    return res
list1 = [{"name":"jack",1:2},[[3.4j,["this","is","the","list"],(1,2,"adf")],3,4],'a','b',('a',"cc",'d'),1,{"name":"jack",1:2}]
res=printList(list1)
print(res)

 

補充:

在Python中,列表是一個動態的指針數組,而array模塊所提供的array對象則是保存相同類型的數值的動態數組。由於array直接保存值,因此它所使用的內存比列表少。列表和array都是動態數組,因此往其中添加新元素,而沒有空間保存新的元素時,它們會自動重新分配內存塊,並將原來的內存中的值複製到新的內存塊中。爲了減少重新分配內存的次數,通常每次重新分配時,大小都爲原來的k倍。k值越大,則重新分配內存的次數越少,但浪費的空間越多。對於list對象,其元素內容並不一定線性存儲,但是由於內存分配的問題,會出現線性存儲的假象,當元素出現容器或者相對前一個元素類型改變時,內存空間就會不再連續

 

參考鏈接:

1、https://www.cnblogs.com/hellcat/p/8795841.html『Python』內存分析_list和array

2、https://blog.csdn.net/qq_39026556/article/details/82716207(關於python中列表的遍歷和多層嵌套拆開)

3、https://blog.csdn.net/SeeTheWorld518/article/details/46756355(Python中嵌套list的遍歷)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章