Python 列表大法
列表和字典佔據了我們編程的大部分,這篇我們重點來分享列表。
0. 內建常用數據結構:
內建常用數據結構有兩種。在學習列表之前,我們首先要定位列表屬於順序表。:
- 序列sequence
- 字符串str,字節序列byte、bytearray
- 列表list、元組tuple
- 鍵值對
- 集合set
- 字典dict
線性數據結構
線性表:
- 有有窮個元素組成;
順序表:
- 使用一大塊連續內存存儲表中的元素
鏈接表
- 鏈表之間的聯繫不是像順序表,一個挨着一個擺放,他們是散放的,分佈是不均勻的。他們前一個知道下一個的內存地址,他們就是靠這種關係關聯起來的;那麼爲了找到下一個元素,就需要按照地址順序查找,這種遍歷因爲是按照地址順序查找的,所以速度還可以,不過要考慮數據量大的情況;
- 分散存儲的元素鏈接起來。鏈表節點的實現:
class Node(object):
"""節點"""
def __init__(self, elem):
self.elem = elem
self.next = None
1. Python list列表的屬性
- 列表的特徵
-
- 列表是可索引的 --說明列表裏面元素是有序排列的。
-
- 列表是可變的
-
- 列表可遍歷–說明列表是容器。
-
- 列表是有序的–說明列表是用順序表實現的。
-
- 列表是線性表
列表的索引
正索引:從做到右,從0開始 [0, len()-1]
負索引:從右到左,從-1開始 [-len(), -1]
索引定位的時間複雜度O(1),是列表最好的使用方式。
Python列表的增刪改查腦圖(雙擊查看大圖):
2. Python列表的查詢
2.1 index
2.2 count
index和count能少用則少用
2.3 len
查詢 | 方法 | 原理 | 複雜度 | 代碼片 |
---|---|---|---|---|
index | index(value,start,[stop]) | 通過value值,從指定區間查找列表內的元素是否匹配;匹配到第一個就立即返回索引;匹配不到,拋出異常ValueError | O(n),即隨着列表數量規模的增大,複雜度增高 On | a = [1,2,4,‘a’] print(a.index(99)) |
count | count(value) | 返回列表中匹配Value的次數(重複次數查詢) | O(n),即隨着列表數量規模的增大,複雜度增高 O n | a = [1,2,2,4,‘a’] a.count(2) print(a.count(2)) |
// index 例子
a = [1,2,3,4]
print(a.index(99))
>>> ValueError
3. Python list列表的修改
3.1. append insert 和extend
3.1.1 insert
insert() 函數用於將指定對象插入列表的指定位置。
語法
insert()方法語法:
list.insert(index, obj)
參數
index – 對象 obj 需要插入的索引位置。
obj – 要插入列表中的對象。
返回值
該方法沒有返回值,但會在列表指定位置插入對象。
list.append(object) 向列表中添加一個對象object;
list.extend(sequence) 把一個序列seq的內容添加到列表中。
insert() 函數用於將指定對象插入列表的指定位置。
music_media = ['compact disc', '8-track tape', 'long playing record']
new_media = ['DVD Audio disc', 'Super Audio CD']
music_media.append(new_media)
print music_media
>>>['compact disc', '8-track tape', 'long playing record', ['DVD Audio disc', 'Super Audio CD']]
3.1.2 append
定位時間複雜度是O(1)。
使用append的時候,是將new_media看作一個對象,整體打包添加到music_media對象中。
music_media = ['compact disc', '8-track tape', 'long playing record']
new_media = ['DVD Audio disc', 'Super Audio CD']
music_media.extend(new_media)
print music_media
>>>['compact disc', '8-track tape', 'long playing record', 'DVD Audio disc', 'Super Audio CD']
3.1.3 extend
使用extend的時候,是將new_media看作一個序列,將這個序列和music_media序列合併,並放在其後面。
3.2. *是淺拷貝
深拷貝引用模塊copy:
3.3 + 拼接
3.4 * 是將列表裏面的元素重複3次
4. Python list列表的刪除
練習環境:
str="週一不加班"
list= list(str)
list.pop()
list.remove("一")
list.insert(1,'周')
list.append('班')
print(list)
4.1 刪除Remove(by元素)
Remove沒有返回值:
str="週一不加班"
list= list(str)
return_remove= list.remove('一')
print(return_remove)
4.2 刪除POP (by下標)
str="週一不加班"
list= list(str)
return_pop= list.pop(2)
print(return_pop)
4.3 clear
清除所有元素,剩下空列表,雖然效率很高,但是好不容易生成在內存的數據,爲什麼突然要使用clear
Python 中一切皆對象,而對象都是引用類型, 可以理解爲一個地址指針指向這個對象。
但是字面常量字符串、數值等表現,不像引用類型,暫時可以理解爲簡單類型。
而列表、元組、字典,已經後續的類和實例都是引用類型。
可以認爲簡單類型直接存在列表中,而一弄類型質數把引用地址存在了列表中
5. Sort和Sorted 排序
5.1使用sort排序
默認是升序,如果降序則加reverse = Ture:
如果要比較字符,加key=str
對字符數字進行排序:
使用sort()方法對list排序會修改list本身,不會返回新list,通常此方法不如sorted()方便,但是如果你不需要保留原來的list,此方法將更有效sort()。
sort()不能對dict字典進行排序
sort() 函數用於對原列表進行排序,如果指定參數,則使用比較函數指定的比較函數。
語法:
list.sort( key=None, reverse=False)
參數:
key – 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可迭代對象中,指定可迭代對象中的一個元素來進行排序。
reverse – 排序規則,reverse = True 降序, reverse = False 升序(默認)。
返回值
該方法沒有返回值,但是會對列表的對象進行排序。
5.2 使用sorted()排序
my_list = [3, 5, 1, 4, 2]
result = sorted(my_list)
print result
#輸出: [1, 2, 3, 4, 5]
5.3. 反轉 Reverse
將元素反轉
Python列表操作的時間複雜度:
Python字典操作的時間複雜度:1
棧和隊列
- 棧:後進先出,在內存上有兩種內部實現,可以是列表或者鏈接表,效率基本相同。
- 隊: 先進先出隊列一般不用列表,而是用鏈表。
- 今日學習計劃