[PY3]——內建資料結構(1)——列表及其常用操作

Jelly_lyj發表於2017-03-18

列表及其常用操作_xmind圖

       

 

about列表

列表是一個序列,用於順序儲存資料

列表分為兩種:ArrayList(用陣列實現)、LinkedList(用連結串列實現)

 

定義與初始化

#list()          使用工廠函式list定義一個空列表

#[]              使用中括號定義一個空列表

#[1,2,3]         使用中括號定義有初始值的列表

#list(可迭代物件) 把可迭代物件轉換為一個列表

In [1]: lst=list();print(lst)
[]

In [2]: lst=[];print(lst)
[]

In [3]: lst=[1,2,3];print(lst)
[1, 2, 3]

In [4]: lst=list(range(1,10));print(lst)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

 

修改列表元素

# 直接使用索引操作即可 list[index]=new value

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

In [3]: lst[4]=3

In [4]: print(lst)
[1, 2, 3, 2, 3, 3, 5]

 

訪問列表元素

1. list(index) 通過索引訪問元素,索引規則為:

#索引從0開始
In [5]: print(lst[0])
1

#負數索引從-1開始
In [6]: print(lst[-1])
9
In [7]: print(lst[-2])
8

#當索引(正負都是)超出範圍,會報錯IndexError
In [6]: print(lst[10])
IndexError: list index out of range 

2. index()

# index()主要用於查詢列表中某個值的索引
In [3]:help(lst.index)
index(...) method of builtins.list instance
    L.index(value, [start, [stop]]) -> integer -- return first index of value.
    Raises ValueError if the value is not present.

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

# 返回要查詢的value的第一個索引
In [4]: lst.index(2)
Out[4]: 1

# start引數指定從哪個索引開始查詢
In [5]: lst.index(2,2)
Out[5]: 3

# stop引數指定從到哪個索引結束,且[start,stop]的範圍中不包含stop
# 當value不能在[start,stop]的範圍查詢到,則報錯ValueError
In [6]: lst.index(2,2,3)
ValueError: 2 is not in list

# 若想預設start值,可將其設為0(start的預設值為0,stop的預設值為-1)
In [7]: lst.index(2,0,3)
Out[7]: 1

# start和stop可以是負索引,但總是從左往右查詢
In [8]: lst.index(2,-4,-1)
Out[8]: 1
# 並且要注意:如果stop<start,就相當於在空列表中查詢一個元素,則丟擲ValueError In [9]: lst.index(2,-1,-4) ValueError: 2 is not in list

3. count()

# count()返回某個value值在列表中出現的次數
In [14]: help(lst.count)
Help on built-in function count:
count(...) method of builtins.list instance
    L.count(value) -> integer -- return number of occurrences of value

In [15]: lst.count(2)
Out[15]: 2

In [16]: lst.count(10)
Out[16]: 0

 

新增列表元素

1. append() 用於在list末尾新增一個元素

# 原地修改list,返回結果為none
In [5]: help(lst.append)
Help on built-in function append:
append(...) method of builtins.list instance
    L.append(object) -> None -- append object to end

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

In [2]: lst.append(9)

In [3]: print(lst)
[1, 2, 3, 2, 3, 3, 5, 9]

2. insert() 用於在指定索引位置新增元素

# 原地修改list,返回結果為none
In [12]: help(lst.insert)
insert(...) method of builtins.list instance
    L.insert(index, object) -- insert object before index

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

# 正數索引:實際是使得index位置上的元素為我們所新增的,後面的元素依次往後挪
In [14]: lst.insert(1,11);print(lst)
[1, 11, 2, 3, 2, 3, 3, 5, 9]

In [15]: lst.insert(0,'a');print(lst)
['a', 1, 11, 2, 3, 2, 3, 3, 5, 9]

# 負數索引:實際是在index的前一個位置新增元素
In [16]: lst.insert(-1,'-a');print(lst)
['a', 1, 11, 2, 3, 2, 3, 3, 5, '-a', 9]

# 當index超出索引範圍,正數索引會在最後一個位置新增元素
In [17]: lst.insert(100,'100');print(lst)
['a', 1, 11, 2, 3, 2, 3, 3, 5, '-a', 9, '100']

# 當index超出索引範圍,負數索引會在第0個位置新增元素
In [18]: lst.insert(-100,'-100');print(lst)
['-100', 'a', 1, 11, 2, 3, 2, 3, 3, 5, '-a', 9, '100']

# 比較append和insert:  append的時間複雜度是O(1):常數時間,效率和資料規模無關  insert的時間複雜度是O(n):線性時間,效率和資料規模有關

3. extend()

# extend的引數是一個可迭代物件,在list末尾新增此可迭代物件
#原地修改list,返回結果為none
In [1]: help(lst.extend)
extend(...) method of builtins.list instance
    L.extend(iterable) -> None -- extend list by appending elements from the iterable

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

In [2]: lst.extend([4,5,6]);print(lst)
[1, 2, 3, 4, 5, 6]

In [3]: lst.extend(range(0,4));print(lst)
[1, 2, 3, 4, 5, 6, 0, 1, 2, 3]

4. + list的連線操作

# 連線操作不修改list本身,返回一個新的list
In [9]: lst=[1,2,3]

In [10]: lst+[4,5,6]
Out[10]: [1, 2, 3, 4, 5, 6]

In [11]: print(lst)
[1, 2, 3]

In [12]: lst2=[4,5,6]

In [13]: lst+lst2
Out[13]: [1, 2, 3, 4, 5, 6]

 

刪除列表元素

1. remove() 根據指定的value元素值刪除元素,返回none

# 原地刪除,返回為none
In [1]: help(lst.remove)
remove(...) method of builtins.list instance
    L.remove(value) -> None -- remove first occurrence of value.
    Raises ValueError if the value is not present.

In [2]: lst=[0,1,2,3,2,4,5,6]

# 刪除list中值為4的元素
In [6]: lst.remove(4);print(lst)
[0, 1, 2, 3, 2, 5, 6]

# list中有兩個相同的value時,刪除第一個出現的
In [7]: lst.remove(2);print(lst)
[0, 1, 3, 2, 5, 6]

# 當value不存在,則丟擲ValueError
In [8]: lst.remove(10);print(lst)
ValueError: list.remove(x): x not in list

2. pop() 根據index索引刪除元素,返回被刪除的元素

In [10]: help(lst.pop)
pop(...) method of builtins.list instance
    L.pop([index]) -> item -- remove and return item at index (default last).
    Raises IndexError if list is empty or index is out of range.

# pop()不指定索引時,隨機刪除列表的一個元素,直到list為空
In [36]: lst=[1,0,9,8,2,6,9]

In [37]: lst.pop()
Out[37]: 9
In [38]: lst.pop()
Out[38]: 6
In [39]: lst.pop()
Out[39]: 2
In [40]: lst.pop()
Out[40]: 8
In [41]: lst.pop()
Out[41]: 9
In [42]: lst.pop()
Out[42]: 0
In [43]: lst.pop()
Out[43]: 1
In [44]: lst.pop()
IndexError: pop from empty list

# pop(index)指定index時,刪除該索引對應的值
In [45]: lst=[1,0,9,8,2,6,9]

In [46]: lst.pop(0)
Out[46]: 1

In [47]: lst.pop(-1)
Out[47]: 9

# pop()和pop(index)比較:pop()傳遞index引數時,時間複雜度是O(n)      不傳遞index引數時,時間複雜度是O(1)

3. clear() 清空一個列表

In [16]: help(lst.clear)
clear(...) method of builtins.list instance
    L.clear() -> None -- remove all items from L

In [17]: print(lst)
[1, 2]

In [18]: lst.clear()

In [19]: print(lst)
[]

 

其他常用操作

1. len( )

# 求list長度
In [20]: lst=list(range(0,6))

In [21]: len(lst)
Out[21]: 6

2. reverse ( )

# 反轉列表
In [23]: help(lst.reverse)
reverse(...) method of builtins.list instance
    L.reverse() -- reverse *IN PLACE*

In [24]: print(lst)
[0, 1, 2, 3, 4, 5]

In [25]: lst.reverse()

In [26]: print(lst)
[5, 4, 3, 2, 1, 0]

3. sort( )

# 對列表排序
In [27]: help(lst.sort)
sort(...) method of builtins.list instance
    L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*

In [28]: lst=[1,2,3,2,7,8]

In [29]: lst.sort()

In [30]: print(lst)   #預設為正序
[1, 2, 2, 3, 7, 8]

In [31]: lst.sort(reverse=True);print(lst)  #設定reverse=True為逆序
[8, 7, 3, 2, 2, 1]

# key=None 實際是可以自定義的一個函式引數(python的函式可以作為函式引數使用)
keys=[('x',3),('z',6),('y',1)]
keys.sort(key=lambda x:x[0])
print(keys)
[('x', 3), ('y', 1), ('z', 6)]

4. 拷貝

# 賦值操作‘=’是引用傳遞 也叫淺拷貝
In [32]: lst1=[0,1,2]

In [33]: lst2=lst1

In [34]: print(lst2)
[0, 1, 2]

In [35]: lst2[2]=3

In [36]: print(lst1,lst2)   #淺拷貝是lst1跟著變了
[0, 1, 3] [0, 1, 3]

# copy()是影子拷貝
In [37]: help(lst.copy)
copy(...) method of builtins.list instance
    L.copy() -> list -- a shallow copy of L

def copy(lst):         # copy()的實現
    tmp = []
    for i in lst:
        tmp.append(i)
    return tmp

In [38]: lst1=[0,1,2]

In [39]: lst2=lst1.copy()

In [40]: print(lst2)
[0, 1, 2]

In [41]: lst2[2]=3

In [42]: print(lst1,lst2)
[0, 1, 2] [0, 1, 3]

In [43]: lst1=[0,[1,2,3],9]

In [44]: lst2=lst1.copy()

In [47]: print(lst2)
[0, [1, 2, 3], 9]

In [49]: lst2[1][1]=5

In [50]: print(lst2)
[0, [1, 5, 3], 9]

In [51]: print(lst1)    
[0, [1, 5, 3], 9]


# deepcopy()深拷貝
In [52]: lst1=[0,[1,2,3],9]

In [53]: import copy

In [54]: lst2=copy.deepcopy(lst1)

In [55]: print(lst2)
[0, [1, 2, 3], 9]

In [56]: lst2[1][1]=5

In [57]: print(lst2)
[0, [1, 5, 3], 9]

In [58]: print(lst1)
[0, [1, 2, 3], 9]

5. 複製一個列表

lst=[1,2,3]
copy_lst=lst[:]

print(copy_lst) [1, 2, 3]

 






相關文章