Python 101 列表增刪改查常用操作及效率


列表和字典佔據了我們編程的大部分,這篇我們重點來分享列表。

0. 內建常用數據結構:

內建常用數據結構有兩種。在學習列表之前,我們首先要定位列表屬於順序表。:

  1. 序列sequence
    • 字符串str,字節序列byte、bytearray
    • 列表list、元組tuple
  2. 鍵值對
    • 集合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

在這裏插入圖片描述

棧和隊列

  • 棧:後進先出,在內存上有兩種內部實現,可以是列表或者鏈接表,效率基本相同。
  • 隊: 先進先出隊列一般不用列表,而是用鏈表。
  • 今日學習計劃

  1. 時間複雜度測量方法
    在這裏插入圖片描述 ↩︎

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