## 數(shù)據(jù)類型詳解-列表
> 列表就是一組有序的數(shù)據(jù)組合黎做,列表中的數(shù)據(jù)可以被修改
## 列表的定義
+ 可以使用 中括號進行定義 []?
+ 也可以使用 list函數(shù) 定義
+ 在定義列表中的元素時叉跛,需要在每個元素之間使用逗號,進行分隔蒸殿。[1,2,3,4]
+ 列表中的元素可以是任意類型的筷厘,通常用于存放同類項目的集合
## 列表的基本操作
+ 列表定義-[],list()
+ 列表相加-拼接
+ 列表相乘-重復(fù)
+ 列表的下標- 獲取,更新
+ 列表元素的添加-append()
+ 列表元素的刪除
?+ del 列表[下標]
?+ pop()函數(shù) 刪除元素
## 列表中切片
> 語法==> 列表[開始索引:結(jié)束索引:步進值]
1鸣峭。 列表[開始索引:]?==> 從開始索引到列表的最后
2。 列表[:結(jié)束值]??==> 從開始到指定的結(jié)束索引之前
3酥艳。 列表[開始索引:結(jié)束索引] ==> 從開始索引到指定結(jié)束索引之前
4摊溶。 列表[開始索引:結(jié)束索引:步進值] ==> 從指定索引開始到指定索引前結(jié)束,按照指定步進進行取值切片
5充石。 列表[:] 或 列表[::] ==> 所有列表元素的切片
6莫换。 列表[::-1]?==> 倒著獲取列表的元素
示例:
```python
varlist = ['劉德華','張學(xué)友','張國榮','黎明','郭富城','小沈陽','劉能','宋小寶','趙四']
# 從開始索引到列表的最后
res = varlist[2:] # ['張國榮','黎明','郭富城','小沈陽','劉能','宋小寶','趙四']
# 從開始到指定的結(jié)束索引之前
res = varlist[:2] # ['劉德華','張學(xué)友']
# 從開始索引到指定結(jié)束索引之前
res = varlist[2:6] # ['張國榮', '黎明', '郭富城', '小沈陽']
# 從指定索引開始到指定索引前結(jié)束,按照指定步進進行取值切片
res = varlist[2:6:2] # ['張國榮', '郭富城']
# 所有列表元素的切片
res = varlist[:]
res = varlist[::]
# 倒著輸出列表的元素
res = varlist[::-1]
# 使用切片方法 對列表數(shù)據(jù)進行更新和刪除
print(varlist)
# 從指定下標開始骤铃,到指定下標前結(jié)束拉岁,并替換為對應(yīng)的數(shù)據(jù)(容器類型數(shù)據(jù),會拆分成每個元素進行賦值)
# varlist[2:6] = ['a','b','c',1,2,3]
# varlist[2:6:2] = ['a','b'] # 需要與要更新的元素個數(shù)對應(yīng)
# 切片刪除
# del varlist[2:6]
del varlist[2:6:2]
```
## 列表相關(guān)函數(shù)
```python
varlist = ['劉德華','張學(xué)友','張國榮','張學(xué)友','黎明','郭富城','小沈陽','劉能','宋小寶','趙四']
# len()?檢測當前列表的長度惰爬,列表中元素的個數(shù)
res = len(varlist)
# count() 檢測當前列表中指定元素出現(xiàn)的次數(shù)
res = varlist.count('張學(xué)友')
# append() 向列表的尾部追加新的元素喊暖,返回值為 None
varlist.append('川哥')
# insert() 可以向列表中指定的索引位置添加新的元素,
varlist.insert(20,'aa')
# pop() 可以對指定索引位置上的元素做 出棧 操作撕瞧,返回出棧的元素
res = varlist.pop() # 默認會把列表中的最后一個元素 出棧
res = varlist.pop(2) # 會在列表中把指定索引的元素進行 出棧
varlist = [1,2,3,4,11,22,33,44,1,2,3,4]
# remove() 可以指定列表中的元素 進行 刪除,只刪除第一個陵叽。如果沒有找到,則報錯
res = varlist.remove(1)
# index() 可以查找指定元素在列表中第一次出現(xiàn)的索引位置
# res = varlist.index(1)
# res = varlist.index(1,5,20) # 可以在指定索引范圍內(nèi)查找元素的索引位置
# extend() 接收一個容器類型的數(shù)據(jù)丛版,把容器中的元素追加到原列表中
# varlist.extend('123')
# s.clear() # 清空列表內(nèi)容
# varlist.clear()
# reverse() 列表翻轉(zhuǎn)
varlist.reverse()
# sort() 對列表進行排序
res = varlist.sort() # 默認對元素進行從小到大的排序
res = varlist.sort(reverse=True) # 對元素進行從大到小的排序
res = varlist.sort(key=abs) # 可以傳遞一個函數(shù)巩掺,按照函數(shù)的處理結(jié)果進行排序
```
## 深拷貝與淺拷貝
### 淺拷貝
> 淺拷貝只能拷貝列表中的一維元素,**如果列表中存在二維元素或容器硼婿,則引用而不是拷貝**
>
> 使用cpoy函數(shù)或者copy模塊中的copy函數(shù)拷貝的都是淺拷貝
```python
# 淺拷貝 只能拷貝當前列表锌半,不能拷貝列表中的多維列表元素
varlist = [1,2,3]
# 簡單的拷貝 就可以把列表復(fù)制一份
newlist = varlist.copy()
# 對新拷貝的列表進行操作,也是獨立的
del newlist[1]
# print(varlist,id(varlist))
# print(newlist,id(newlist))
'''
[1, 2, 3] 4332224992
[1, 3] 4332227552
'''
# 多維列表
varlist = [1,2,3,['a','b','c']]
# 使用copy函數(shù) 拷貝一個多維列表
newlist = varlist.copy()
'''
print(newlist,id(newlist))
print(varlist,id(varlist))
[1, 2, 3, ['a', 'b', 'c']] 4361085408
[1, 2, 3, ['a', 'b', 'c']] 4361898496
'''
# 如果是一個被拷貝的列表寇漫,對它的多維列表元素進行操作時刊殉,會導(dǎo)致原列表中的多維列表也發(fā)生了變化
del newlist[3][1]
'''
通過id檢測,發(fā)現(xiàn)列表中的多維列表是同一個元素(對象)
print(newlist[3],id(newlist[3]))
print(varlist[3],id(varlist[3]))
['a', 'c'] 4325397360
['a', 'c'] 4325397360
'''
```
### 深拷貝
> 深拷貝就是不光拷貝了當前的列表州胳,**同時把列表中的多維元素或容器也拷貝了一份记焊,而不是引用**
>
> 使用copy模塊中的 deepcopy 函數(shù)可以完成深拷貝
```python
# 深拷貝 就是不光拷貝了當前的列表,同時把列表中的多維元素也拷貝了一份
import copy
varlist = [1,2,3,['a','b','c']]
# 使用 copy模塊中 深拷貝方法 deepcopy
newlist = copy.deepcopy(varlist)
del newlist[3][1]
print(varlist)
print(newlist)
'''
??print(newlist[3],id(newlist[3]))
??print(varlist[3],id(varlist[3]))
??['a', 'c'] 4483351248
??['a', 'b', 'c'] 4483003568
'''
```
## 列表推到式
>List-Comprehensions
>
>列表推導(dǎo)式提供了一個更簡單的創(chuàng)建列表的方法栓撞。
>
>常見的用法是把某種操作應(yīng)用于序列或可迭代對象的每個元素上遍膜,然后使用其結(jié)果來創(chuàng)建列表,或者通過滿足某些特定條件元素來創(chuàng)建子序列瓤湘。
>
>采用一種表達式的當時瓢颅,對數(shù)據(jù)進行過濾或處理,并且把結(jié)果組成一個新的列表
### 一弛说,基本的列表推到式使用方式
> 結(jié)果變量 = [變量或變量的處理結(jié)果 for 變量 in 容器類型數(shù)據(jù)]
示例:
```python
# 1 假設(shè)我們想創(chuàng)建一個平方列表
# 使用普通方法完成
varlist = []
for i in range(10):
??varlist.append(i**2)
# print(varlist)?# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 使用 map函數(shù)和list完成
varlist = list(map(lambda x: x**2, range(10)))
# print(varlist)?# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 使用列表推到式完成 下面這個列表推到式和第一種方式是一樣的
varlist = [i**2 for i in range(10)]
# print(varlist)?# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 2挽懦。 '1234' ==> [2,4,6,8]
# 常規(guī)方法完成需求
varstr = '1234'
newlist = []
for i in varstr:
??newlist.append(int(i)*2)
# print(newlist)?# [2, 4, 6, 8]
# 使用列表推到式完成上面的需求
newlist = [int(i)*2 for i in varstr]
# print(newlist)?# [2, 4, 6, 8]
# 使用列表推到式+位運算完成
newlist = [int(i) << 1 for i in varstr]
# print(newlist)?# [2, 4, 6, 8]
```
### 二,帶有判斷條件的列表推到式
> 結(jié)果變量 = [變量或變量的處理結(jié)果 for i in 容器類型數(shù)據(jù) 條件表達式]
示例:
```python
# 0-9 求所有的偶數(shù)木人,==> [0, 2, 4, 6, 8]
# 常規(guī)方法完成
newlist = []
for i in range(10):
??if i % 2 == 0:
????newlist.append(i)
# print(newlist) # [0, 2, 4, 6, 8]
# 列表推到式完成
newlist = [i for i in range(10) if i % 2 == 0]
# print(newlist)?# [0, 2, 4, 6, 8]
```
### 三信柿,對于嵌套循環(huán)的列表推到式
```python
'''
# 下面這個 3x4的矩陣冀偶,它由3個長度為4的列表組成,交換其行和列
[
?[1, 2, 3, 4],
?[5, 6, 7, 8],
?[9, 10, 11, 12],
]
==>
[
??[1, 5, 9],?
??[2, 6, 10],?
??[3, 7, 11],?
??[4, 8, 12]
]
'''
arr = [
?[1, 2, 3, 4],
?[5, 6, 7, 8],
?[9, 10, 11, 12],
]
# 常規(guī)方法完成
# newlist = []
# for i in range(4):
#???res = []
#???for row in arr:
#?????res.append(row[i])
#???newlist.append(res)
# print(newlist)
# 使用列表推到式完成
newlist = [[row[i] for row in arr] for i in range(4)]
print(newlist)
```