本節內容: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方法刪除列表的全部元素。
(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()打印出引用指向的內存塊的地址。
成員關係判斷
【舉例】:如何去除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元素,切片是很差作的:
下劃線_ 是指當咱們要丟棄一個變量時使用的。
再如,咱們取一頭一尾:
再看兩個複雜點的:
只要兩邊結構是同樣的,解包多少層都是能夠的。