天天看點

【Python基礎學習】第二節 清單操作Python基礎學習之清單操作

Python基礎學習之清單操作

1. 清單的增,删,改,查

1.1 清單的增加,常用的方法有:append, extent, incert

  1. append() 在清單的最後面增加元素;
heros = ['馬裡奧', '路易斯', '林克']
# 清單的增加 append()
heros.append('後羿')  # 在清單最後追加值
print(heros)    #輸出:['馬裡奧', '路易斯', '林克', '後羿']
           
  1. insert() 在清單的指定位置增加元素;
# 清單插入
heros.insert(3, '戰神')
print(heros)    # 輸出:['馬裡奧', '路易斯', '林克', '戰神', '後羿']
           
  1. extend() 将兩個清單合并為一個清單
# 清單合并
heros2 = ['屠夫', '虛空']
heros.extend(heros2)
print(heros)    # 輸出:['馬裡奧', '路易斯', '林克', '戰神', '後羿', '屠夫', '虛空']
           

1.2 清單的删除,常用的方法有:pop, clear , remove

  1. pop() 在清單的最後面增加元素;pop() 隻可以傳入整數的index值,不能傳入清單中的元素;
heros= ['馬裡奧', '路易斯', '林克', '戰神', '後羿', '屠夫', '虛空']
x = heros.pop()  # 預設删除最後一個資料,并傳回被删除的值
print(heros)  # heros中删除了最後的元素,輸出為:['馬裡奧', '路易斯', '林克', '戰神', '後羿', '屠夫']
print(x)  # pop 方法傳回了被删除的值,這一點很重要,可以對變成帶來便利;輸出為:虛空
x = heros.pop(3)  # pop() 也可以指定删除的位置,x輸出為:戰神
           
  1. clear() 清空清單中的所有元素,但是保留清單名,即:使清單變為空清單,但清單存在;
heros.clear() #清空heros中的所有元素;
print(heros)  # 輸出:[]
# del 也可以使用但是不推薦,如果沒有寫index, 會将變量都删掉,即不再有hores這個清單;
           
  1. remove() 可以傳入清單中的元素
heros.remove('路易斯')
heros.remove('路易斯')   #再次删除,資料不存在,則會報錯 ValueError: list.remove(x): x not in list
print(heros)   
           
  1. del() 可以删除元素(不推薦使用),也可以删除清單變量本身,一般用來删除變量本身
a=['a','b','c']
# 删除元素  不推薦使用這種方法!
del a[1]   #傳入元素,則删除對應的元素; 
print(a)   # 輸出為:['a', 'c']

# 删除變量
del a
print(a)    # 變量a 已經被删除,是以這裡會報錯; error: name 'a' is not defined
           

1.3 清單的修改,直接對制定元素指派即可;

  • 對制定元素進行指派,即可修改清單;
# 清單的修改
heros = ['後羿', '屠夫', '路易吉', '馬裡奧']
heros[1] = '庫裡'
print(heros)   # 輸出:['後羿', '庫裡', '路易吉', '馬裡奧']
           

1.4 清單的查詢,常用方法有 index, count, in

  1. index() 傳入清單的元素,可以傳回元素在清單中的位置
heros = ['後羿', '庫裡', '路易吉', '馬裡奧']
a = heros.index('庫裡')
print(a)  # 傳回元素的位置,輸出:1
b = heros.index('林克')   # 清單中沒有值,會報錯;error: '林克' is not in list
           
  1. count() 可以查詢清單中的某個值的個數
heros = ['後羿', '庫裡', '路易吉','庫裡', '馬裡奧']
a = heros.count('庫裡')
print(a)  # 傳回元素的位置,輸出:2
           
  1. in 可以查詢某個值是否在清單中
heros = ['後羿', '庫裡', '路易吉','庫裡', '馬裡奧']
print('林克' in heros)   # 傳回False
           

2. 清單的排序 (sort, sorted, reverse)

這裡需要說明一下 sort & sorted 的差別:

sort 是對原清單進行排列,即原清單會改變;

sorted 是傳回一個排列後的清單作為傳回值,即原清單不會改變,會傳回一個排序後的新清單;

heros = ['後羿', '庫裡', '路易吉','庫裡', '馬裡奧']
heros.sort()
print(heros)     # 輸出:['後羿', '庫裡', '庫裡', '路易吉', '馬裡奧']
heros.sort(reverse=True)   # 返序排列
print(heros)     # 輸出:['馬裡奧', '路易吉', '庫裡', '庫裡', '後羿']
a = sorted(heros)  # 不會影響原清單,會傳回一個排序後的新清單;
print(a)        # 輸出:['後羿', '庫裡', '庫裡', '路易吉', '馬裡奧']
print(heros)    # 輸出:['馬裡奧', '路易吉', '庫裡', '庫裡', '後羿']
heros.reverse() # 翻轉清單,與 heros.sort(reverse=True) 一樣
           

3. 清單的循環 (for ... in ... & for ... in enumerate(...) )

3.1 for ... in ...

可以用這種方法,循環清單中的所有元素;

heros = ['後羿', '庫裡', '路易吉','庫裡', '馬裡奧']
for hero in heros:
	print(hero)   # 輸出:後羿  庫裡  路易吉  庫裡  馬裡奧 
           

3.2 for ... in enumerate(...)

使用這種方法循環,可以同時獲得元素的index(位置資訊),舉例如下:

heros = ['後羿', '庫裡', '路易吉','庫裡', '馬裡奧']
for id,hero in enumerate(heros):
	print(id ,'--',hero)
# 輸出如下:
# 0 -- 後羿
# 1 -- 庫裡
# 2 -- 路易吉
# 3 -- 庫裡
# 4 -- 馬裡奧
           

4. 清單的複制

4.1 不是複制的複制

首先看以下代碼:

heros = ['後羿', '庫裡', '路易吉','庫裡', '馬裡奧']
copyheros = heros
print(copyheros)     # 輸出:['後羿', '庫裡', '路易吉', '庫裡', '馬裡奧']
heros[1] = '宙斯大魔王'
print(heros)         # 輸出:['後羿', '宙斯大魔王', '路易吉', '庫裡', '馬裡奧']
print(copyheros)     # 輸出:['後羿', '宙斯大魔王', '路易吉', '庫裡', '馬裡奧'] 
           

我們會有一個問題:為什麼copyheros 的值會變?!?! 這似乎與我們的想法不一樣。原因如下:

這裡:copyheros = heros ,其實并沒有複制,隻是将 copyheros 指向了 heros,兩個變量其實是共享一個記憶體位址的,是以當其中任何一個方法變化,另一個也會發生變化;圖解如下:

【Python基礎學習】第二節 清單操作Python基礎學習之清單操作

是以,這裡并沒有任何的複制發生!

4.2 淺複制

如果以上的方法無法複制,那麼我們需要怎樣才能複制清單呢? 答案是:我們需要使用copy() 方法;

heros = ['後羿', '庫裡', '路易吉','庫裡', '馬裡奧']
copyheros = heros.copy()
print(copyheros)     # 輸出:['後羿', '庫裡', '路易吉', '庫裡', '馬裡奧']
heros[1] = '宙斯大魔王'
print(heros)     # 輸出:['後羿', '宙斯大魔王', '路易吉', '庫裡', '馬裡奧']
print(copyheros)     # 輸出:['後羿', '庫裡', '路易吉', '庫裡', '馬裡奧']
           

從上面的例子,我們可以看到,更改heros 的元素後, copyheros 未發生變化;這裡的copyheros 就是淺複制; 為什麼這樣的複制還叫淺複制呢?請繼續看~

4.3 深複制

前面講了淺複制,所謂淺複制,通俗的說:就是隻能複制清單中的第一層; 總所周知,清單是可以嵌套的,例如: ['後羿', '庫裡', '路易吉', [ '獵人', '法師', '牧師' ] , '馬裡奧'],這裡的清單中,出現了另一個清單[ '獵人', '法師', '牧師'], 當出現這種情況時,淺複制無法複制清單中的清單,參考下面的例一;因為:清單中的清單依然隻共享一個記憶體空間; 想要一個完整的複制,需要使用copy子產品中的 deepcopy(), 舉例如例二:

heros = ['後羿', '庫裡', '路易吉',[ '獵人', '法師', '牧師' ], '馬裡奧']
copyheros = heros.copy()
print(copyheros)    # 輸出:['後羿', '庫裡', '路易吉',[ '獵人', '法師', '牧師' ], '馬裡奧']
heros[3][1] = '變身!!!'
print(heros)  # 輸出:['後羿', '庫裡', '路易吉', ['獵人', '變身!!!', '牧師'], '馬裡奧']
print(copyheros)   # 輸出:['後羿', '庫裡', '路易吉', ['獵人', '變身!!!', '牧師'], '馬裡奧']
           
import copy
heros = ['後羿', '庫裡', '路易吉',[ '獵人', '法師', '牧師' ], '馬裡奧']
copyheros = copy.deepcopy(heros)
print(copyheros)   # 輸出:['後羿', '庫裡', '路易吉', ['獵人', '法師', '牧師'], '馬裡奧']
heros[3][1] = '變身!!!'
print(heros)    # 輸出:['後羿', '庫裡', '路易吉', ['獵人', '變身!!!', '牧師'], '馬裡奧']
print(copyheros)    # 輸出:['後羿', '庫裡', '路易吉', ['獵人', '法師', '牧師'], '馬裡奧']
           
  • 使用 = ,沒有建立複制;
  • 淺複制隻是建立了一層的複制體;
  • 深複制就是建立了一個完全獨立的複制體;