List列表
問題:
如何將計算機運算的數據臨時存入一個地方,同時又方便添加,刪除,修改,查看等操作
答案就是使用“容器”啦
列表 list
列表是一種容器
列表是可以被改變的序列容器,可變的數據對象(python中可變數據對象只有四種,後面會一一介紹)
1、列表的創建
1)字面值
創建空列表的字面值
L = [] # L 綁定一個新創建的空列表
創建非空列表的字面值:
L = [1, 2, 3, 4]
L = ["北京", "上海", "深圳"]
L = [1, "二", 3.14, "Four"]
L = [1, 2, [3.1, 3.2, 3.3], 4]
2)列表的構造(創建)函數 list
list() #創建一個空的列表,等同於[]
list(iterable) #用可迭代對象創建一個列表
示例:
L = list() # L綁定空列表
L = list("hello") #L綁定['h','e','l','l','o']
L = list(range(10)) # L綁定[0,1,2,3...9]
3)列表推導式 list comprehesion
列表推導式是用可迭代對象創建列表的表達式
作用:
創建列表
語法:
[ 表達式 for 變量 in 可迭代對象]
或
[ 表達式 for 變量 in 可迭代對象 if 真值表達式 ]
示例:
#生成一個數值爲1~9的平反的列表
L = [ x**2 for x in range(1,10) ]
# L = [1,4,9,16,...,64,81]
#生成一個1~9中的奇數的平反
L = [ x**2 for x in range(1,10) if x%2 == 1]
#以上的列表推導式可以改寫爲:
L = []
for x in range(1,10)
if x%2 == 1:
L.append(x**2)
列表推導式的嵌套語法:
[ 表達式
for 變量1 in 可迭代對象1 if 真值表達式1
for 變量2 in 可迭代對象2 if 真值表達式2
...]
示例:
L = [x+y for x in 'abc' for y in '123']
#L = ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3']
2、列表的操作、運算
1)列表的算術運算
*+ += * =
示例:
+ 加號用於拼接列表
x = [1, 2, 3]
y = [4, 5, 6]
z = x + y # z = [1, 2, 3, 4, 5, 6]
+= 用於原列表與右側可迭代對象進行拼接,用變量綁定列表
語法:
x += 可迭代對象
如:
x = [1, 2, 3]
y = [4, 5, 6]
x += y # x綁定[1, 2, 3, 4, 5, 6]
“ * ” 運算生成重複的列表
“*= ” 運算讓原列表重複n次再用原變量綁定
x = [1, 2] * 3 # x =[1, 2, 1, 2, 1, 2]
x = [1, 2]
x *= 2 # x = [1, 2, 1, 2]
2)列表的比較運算:
運算符:
<、 <=、 >、 >=、 ==、 !=
說明:
列表的比較規則與字符串的比較規則相同,只有當前面當前比較的數據相等時,才繼續往後比較,否則返回當前結果列表要求每兩個元素能依次進行比較,否則會出現類型錯誤。
當比較元素個數不等時:
如果前面的數都相等,則較長的一個大;如果前面出現不相等的數據,則根據該數據返回結果
結果爲兩兩進行比較,結果爲第一個非相等結果(非全等情況)
列表的 in / not in 運算符
判斷一個值是否在與列表中,如果存在返回True
否則返回false
同字符串的 in 運算符類似
3)列表的索引操作:
索引取值
語法:
x = 列表[整數表達式]
用法:
等同於字符串索引(可以正向或者反向索引)
索引賦值:
列表時一個可變的序列(容器),可以通過索引賦值改變列表中的元素
語法:
列表[整數表達式] = 表達式
4)列表的切片操作
切片取值
列表[起始索引:終止索引:切片步長]
列表的切片取值是從原列表中去除從起始索引到終止索引按切片步長取出的數據組成的一個新列表
切片的賦值操作(只能對可變序列進行操作)
作用:
可以改變原列表的排列,可以插入和修改數據
語法:
列表[切片] = 可迭代對象(可迭代對象裏面的每個元素生成爲列表相對位置的一個元素)
說明:
切片賦值的賦值運算符(=)的右側必須是一個可迭代對象
示例與注意事項:
L = [2,3,4]
L[0:1] = [12,123]
當步長爲1時,就把切出來的位置的數據刪除插入爲後面的可迭代對象的數據
當步長不爲1時,插入的可迭代對象的元素數必須爲切出來的數據的段數/個數,然後每個位置插入一個數據
L[1:1] = [可迭代DATA]可以實現數據的插入
往後續插入的話,可以使用越界索引,即最後一個索引之後即len(L)
例如:L[len(L):len(L)] = [可迭代data],在列表的最後插入
5)列表的元素刪除
del 語句
可以刪除列表的元素
語法:
del 列表[整數表達式]
del 列表[切片]
python3中常用於序列的函數:
len(x)返回序列的長度
max(x)返回序列的最大值元素
min(x)返回序列的最小值元素
sum(x)返回序列中所有元素的和(要求序列中的每個元素值必須都爲數字類型)
any(x)真值測試,如果序列中有一個值爲真值則返回True
all(x) 真值測試,如果序列中的所有元素的值都爲真值則返回True
備註:
len(),sum(),any()和all()函數的參數是一個可迭代對象即可
max()與min()的參數可以爲一個可迭代對象或者多個數值對象,不可只爲一個數值對象
真、假規則:
1、數字如果非0,則爲真
2、對象如果非空,則爲真
3、None類型爲假
3、python3中常用的列表方法(method)
方法 | 作用 |
---|---|
L.index(v [, begin[, end]]) | 返回對應元素的索引下標, begin爲開始索引,end爲結束索引,當 value 不存在時觸發ValueError錯誤 |
L.insert(index, obj) | 將某個元素插放到列表中指定的位置 |
L.count(x) | 返回列表中元素的個數 |
L.remove(x) | 從列表中刪除第一次出現在列表中的值 |
L.copy() | 複製此列表(只複製一層,不會複製深層對象) |
L.append(x) | 向列表中追加單個元素 |
L.extend(lst) | 向列表追加另一個列表,lst爲一個可迭代對象 |
L.clear() | 清空列表,等同於 L[:] = [] |
L.sort(reverse=False) | 將列表中的元素進行排序,默認順序按值的小到大的順序排列 |
L.reverse() | 列表的反轉,用來改變原列表的先後順序 |
L.pop([index]) | 刪除索引對應的元素,如果不加索引,默認刪除最後元素,同時返回刪除元素的引用關係 |
深拷貝 deep copy 和淺拷貝 shallow copy
(差別在與兩個之間所關聯的深層對象是否被複制)
淺拷貝:
L = [1,2,3]
L2 = L ,這個並沒有拷貝
L2 = L.copy() 這個是淺拷貝
淺拷貝是指在複製過程中,只複製一層變量,不會複製深層變量綁定對象的複製過程
如:
L= [1,2,3]
L1 = [1,2,L]
L2 = L1.copy() #淺拷貝此時 id(L1[2]) = id(L2[2])且id(L1)!=id(L2)(id(L1[n]) = id(L2[n]) n屬於(0~len(L1)-1)
此時的L1與L2中的L都指向同一個內存地址/數據,也就是這裏只copy了L綁定的對象的地址,並不是深層的copy了L中的元素
此時修改了L1或者L2中的L,兩個L1,L2中的L都會被修改,因爲是同一個L
>>>id(L)
1936964996424
>>>id(L1[2])
1936964996424
>>>id(L2[2])
1936964996424
注:只有可變對象需要深拷貝,不可變對象無需深拷貝,因爲不會出現拷貝對象深層被修改的情況
深拷貝:
如:
import copy #使用copy模塊中的deepcopy函數
L= [1,2,3]
L1 = [1,2,L]
L2 = copy.deepcopy(L1)
此時實現了深拷貝
對深拷貝後的對象任意一個進行修改,不會影響到另一個
深拷貝會耗費更多的時間和內存
4、列表和字符串的比較:
1.列表和字符串均爲序列,元素之間有先後順序關係
2.列表和字符串有相同的操作:+ += * *= < > in / not in 索引 和 切片…
3.字符串是不可變的序列,列表是可變的序列
4.字符串的每個元素只能存儲字符,而列表可以存儲任意類型的元素
5.列表和字符串都是可迭代對象