Python內置數據結構--列表

本節內容:python

  • 列表
  • 元組
  • 字符串
  • 集合
  • 字典

本節先介紹列表。app

 

1、列表

一種容器類型。列表能夠包含任何種類的對象,好比說數字、子串、嵌套其餘列表、嵌套元組。
任意對象的有序集合,經過索引訪問其中的元素。其長度可變,支持異構(在一個列表中能夠包含多種不一樣類型的元素),能夠任意嵌套。
列表是可變對象,支持在原處修改。列表的可變變如今其內部的每個元素存儲在列表中不是對象自己,而是對象的引用。所以其修改的是對象的引用。

help()是ipython裏特有的函數,能夠打印出類、函數的一些信息。函數

In [1]: help(list)

Help on class list in module builtins:

class list(object)
 |  list() -> new empty list
 |  list(iterable) -> new list initialized from iterable's items
 |  
 |  Methods defined here:
 |  
 |  __add__(self, value, /)
 |      Return self+value.
 |  
 |  __contains__(self, key, /)
 |      Return key in self.
 |  
 |  __delitem__(self, key, /)
 |      Delete self[key].
 |  
 |  __eq__(self, value, /)
 |      Return self==value.
 |  
 |  __ge__(self, value, /)
 |      Return self>=value.
 |  
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |  
 |  __getitem__(...)
 |      x.__getitem__(y) <==> x[y]
 |  
 |  __gt__(self, value, /)
 |      Return self>value.
 |  
 |  __iadd__(self, value, /)
 |      Implement self+=value.
 |  
...

  

1. 初始化列表ui

list(),裏面能夠什麼都不放,也能夠放可迭代對象。
直接一個[]

In [2]: lst = list()

In [3]: lst = []

In [4]: lst
Out[4]: []

In [5]: lst = [1, 2, 3]

In [6]: lst
Out[6]: [1, 2, 3]

  

2. 下標/索引操做lua

python中list的索引從0開始。絕大多數語言的下標是從0開始的,也有少部分例外,好比awk、lua。
負數的索引表示從後往前數,由-1開始,-1表示最後一個元素。

In [6]: lst
Out[6]: [1, 2, 3]

In [7]: lst[0]
Out[7]: 1

In [8]: lst[-1]
Out[8]: 3
若是索引超出範圍,將引起IndexError。

In [9]: lst[-4]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-9-7ea420056b9a> in <module>()
----> 1 lst[-4]

IndexError: list index out of range

In [10]: lst[3]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-10-298ffefac8cf> in <module>()
----> 1 lst[3]

IndexError: list index out of range

修改元素的時候,若是超出索引範圍,也會引起IndexError。spa

 

  

 

3. 列表的操做.net

  • 增:append、extend、insert
  • 刪:clear、pop、remove
  • 改:reverse、sort
  • 查:count、index
  • 其餘:copy

 

(1)給list增長元素

append:3d

append方法原地修改list,給list最後增長一個元素。append方法的返回值是None。

 

insert:指針

insert方法操做的索引超出範圍時,若是是正索引,等效於append,若是是負索引,等效於insert(0, object)
insert的時間複雜度是O(n),append的時間複雜度是O(1)。由於insert是要作一個遍歷的。
 

extend:對象

extend的時間複雜度是O(n),這個n是可迭代對象的長度,並非原有list的長度n。
 

(2)刪除元素

pop:

能夠傳入index,默認從最後移除一個元素,而且把這個元素返回回來。

index默認是-1,即最後一個元素,若是index超出索引範圍,會拋出IndexError。

 

remove:

pop是彈出索引對應的值,remove是刪除最左邊的一個值。
pop針對的是索引,remove針對的是值。

remove的時候,若是值不存在,會拋出ValueError。

 

pop和remove的時間複雜度都是O(n)

 

clear:

clear方法刪除列表的全部元素。
 

(4)查找/統計元素

能夠利用index查詢

 

index:

 

start包含,stop不包含。即[start, stop)
index方法根據值查找索引。

 

count:

count返回指定的value在List中出現的次數。

len函數

不是List的方法,它是python的一個內置函數,用於檢查List元素個數。並不只僅是針對List,能夠針對不少對象。

 

(5)修改列表

sort:

原處是指直接修改List

 

reverse:

原處是指直接修改List

 

(6)其餘方法

 copy:

 

如何刪除後面的2?

若是不想在原List上作修改:

lst2 = lst,只是一個指針指到lst指到的那塊內存,所以操做lst2的時候,lst也被修改了。由於它們兩個都是指針,指到同一塊內存。這就用到List的copy函數了。

搞錯了,不是深copy,只是一層copy。

 

id()打印出引用指向的內存塊的地址。

 

成員關係判斷
  • in
  • not in

 

【舉例】:如何去除List中的重複元素

 

列表相加:合併兩個列表,生成了一個新列表。不會修改原列表。這個和子串的相加是同樣的,生成新的子串。

 

序列相乘:就是重複元素屢次。都是生成新對象。
子串乘法:

列表乘法:

 

 

4. 切片

切片一般是用來訪問數據的,若是你對切片賦值的話,產生的結果是不可預料的。切片操做老是返回一個新的list,不會改變原有的list

 

 

seq[start, end]     [start, end)

  

若是想獲取到最後一個元素,省略end

 

 

以上都是從左往右切片,因此左邊的數字要小於右邊的數字。

start超出索引範圍從0開始,end超出索引範圍到到len(lst)結束。

 

 

start爲0時能夠省略,end省略表示打印到最後一個元素,start和end都省略就是copy。

 

切片還有一個第3個參數:step,默認是1

 

當step爲負數的時候,從後往前數,此時start應該大於end,不然返回空列表。

 

 

 

 

切片賦值

對切片賦值,會替換切片原來的元素。

 

一般咱們是不會對切片進行賦值的,會形成不少的誤解。

5. 解包/封包

看一個例子,傳統的swap

可是在python裏面不須要這麼作

 

原來中間的3行代碼變成了如今的1行代碼,這就是解包/封包。
最簡單的解包就是以下:把右邊的元組或者列表(可迭代對象都行)解開成了左邊的兩個變量,這種就是解包。

 

封包就是把一組變量,變成元組。把若干變量或常量封裝到一個變量裏,這就是封包。

咱們顯式的使用封包比較少,可是解包用的不少。

 

應用場景:

 

 

 

 

解包是把集合裏的元素賦值給變量(集合能夠是可迭代對象),賦值完的變量要麼是一個值,要麼是個list,而無論右側集合是列表仍是元組。
封包是把變量構建成元組。下面的這種用法python2是不支持的。

 

好比我想取出list中的下標是0,1,3元素,切片是很差作的:

 

下劃線_ 是指當咱們要丟棄一個變量時使用的。

再如,咱們取一頭一尾:

 

 

再看兩個複雜點的:

只要兩邊結構是同樣的,解包多少層都是能夠的。
相關文章
相關標籤/搜索