Python中的 List
關于List:
- 最最最基本操作
- 其他操作上的問題
- 一、如何判斷 list 重復
- 二、根據 list 里面的每一個 list 的第一個元素排序
- 三、 一個 list 給另一個 list 賦值
- 四、list 與 nparray
- 五、二維列表按列取元素
- 報錯匯總
- IndexError:list assignment Index out of range
- ValueError: invalid literal for int() with base 10: "6960"
- TypeError: unhashable type: 'list'
- List的效率問題(處理大數據時尤為重要)
最最最基本操作
# 創建 L = [] L = ['a', 'b', 'c'] L = ['apple', 123, True] L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] L = list(range(5)) # 取長度 len(L) # 插入 L.insert(2, 'd') # 在指定位置插入元素 L.append('pear') # 在尾部追加元素 # 刪除 L.pop() # 刪除尾部元素 L.pop(1) # 刪除指定位置元素 L.remove('a') # 刪除指定元素 # 元素替換 L[0] = 'banana' # 求元素出現次數 L.count('apple') # 取元素索引 L.index('apple') # 元素排序 L.sort() L.sort(reverse = True) # List切片操作(正數--索引,負數--位) a = [1,2,3,4,5,6] print(a[2:4]) # [3, 4] 左閉右開區間 從索引2到索引4 print(a[-4:-2]) # [3, 4] 左閉右開區間 從倒數第4位到倒數第3位 print(a[:4]) # [1, 2, 3, 4] 默認從索引0開始開始 print(a[4:]) # [5, 6] 默認到最大索引結束 print(a[::1]) # [1, 2, 3, 4, 5, 6] 從索引0開始每1位輸出一次 print(a[::2]) # [1, 3, 5] 從索引0開始每2位輸出一次 print(a[::-1]) # [6, 5, 4, 3, 2, 1] 從最后一位開始,倒序每1位輸出一次 print(a[::-2]) # [6, 4, 2] 從最后一位開始,倒序每2位輸出一次其他操作上的問題
一、如何判斷 list 重復
l1 = [1,2,3] l2 = [3,2,1] print(l1 == l2) # False:l1 和 l2 逐個元素進行比較,相同位置元素全都相同認為 list 相同 print(set(l1) == set(l2)) # True:l1 和 l2 含有的元素相同即認為 list 相同二、根據 list 里面的每一個 list 的第一個元素排序
arr_new = [ [2,3,4] , [3,4,5], [1,2,3] ] sort_arr = [value for index, value in sorted(enumerate(arr_new), key=lambda arr_new: arr_new[1])]# sort_arr = [ [1,2,3] , # [2,3,4], # [3,4,5] ]三、 一個 list 給另一個 list 賦值
方式一: 直接用 = 賦值,實際是把對象 a 的地址給了 b(即 a 和 b 指向內存中相同的位置),所以對 a 做修改,b 也表現為被修改了。
a = [1, 2, 3]b = a # b = [1, 2, 3]a[0] = 0 # b = [0, 2, 3]方式二:使用切片賦值,實際上為 b 重新開辟了一塊內存區域,用 a 的每一個元素的值來給 b 賦值,由于a 、b 在內存中的指向不同,所以修改 a 對 b 并沒有影響
b = a[:] a[0] = 0 b = [1, 2, 3]四、list 與 nparray
術語:
- list 是列表,列表的元素是列表可以稱為多層列表,list最多只有一個維度,是python內置對象。
- nparray 是數組,真正的數組,可以有多個維度,是numpy的數據類型。
1、關于list 轉 nparray
真是一部血淚史!!!!(在此感謝高中同學GL的幫助)
數據處理的時候忽略了一種情況,導致這個 bug,其實這個bug又會引起別的地方的 bug,使用 debug 的方式一步步向上找,才找到問題得根源,debug 大法好!
也說明了在寫程序的時候,寫一段就 test 一段會比較好,一不小心留下的小問題,到最后需要很大力氣回來找原因。
2、nparray 轉 list
b = np.array([[1, 2, 3], [4, 5, 6]]) a = b.tolist() # 結果 b: [[1 2 3][4 5 6]] # 結果 a: [[1, 2, 3], [4, 5, 6]]3、展開
# 1、二維數組轉化為一維數組 b = np.array([[1, 2, 3], [4, 5, 6]]) b = b.reshape((1, -1)) # 結果: [[1 2 3 4 5 6]]# 2、多層 list 展平為一層 a = [[1, 2, 3], [4, 5, 6]] a_flat = [item for sublist in a for item in sublist] # 結果 [1 2 3 4 5 6] # 更多展開方法見:https://www.cnblogs.com/wushaogui/p/9241931.html五、二維列表按列取元素
直接切片是不行的:
a=[[1,2,3], [4,5,6]] print(a[:, 0]) # 嘗試用數組的方法讀取一列失敗我們可以直接構造:
b = [i[0] for i in a] # 從a中的每一行取第一個元素。 print(b) # [1, 4]報錯匯總
IndexError:list assignment Index out of range
情況一:數組索引越界
情況二:數組未初始化
報錯代碼如下:
改為 temp = [0, 0] 注意后面是根據索引賦值,而不是根據append添加值,所以初始化時不能為空。
其實可以不用臨時變量,改為:
ValueError: invalid literal for int() with base 10: “6960”
錯誤含義:應該放一個 int 類型的數據,我放了一個無效的字符 “6960”
去看一下報錯那行的變量是下面這樣的,把string放了進去,找到賦值的地方,去掉了str(),
網上也有人說可以這樣操作,不過我這里是不需要:
import re # 用了int(string)語句的地方改為下面的表達,即去掉所有非數字的字符。 int(re.sub("\D","",string))TypeError: unhashable type: ‘list’
1、原因:set的元素必須是可以hash的元素(hashable items)
- int、float、str、tuple:是可以哈希的
- list、set、dict:是不可哈希的
結果:
{1, 2}
{1, 2}
結果:
TypeError: unhashable type: ‘list’
TypeError: unhashable type: ‘list’
2、一般使用 set 里面放 list 的目的是想獲得不重復的 list 的集合
# 換個思路:list中元素都排序后就可以識別重復 list_temp.sort() if list_temp not in list_total:list_total.append(list_temp)List的效率問題(處理大數據時尤為重要)
1、檢查元素
與字典、集合相比,檢查列表中元素是否存在某個值是非常緩慢的,這是因為Python在列表中進行了線性逐個掃描,而在字典和集合中Python是同時檢查所有元素的(基于哈希表)
2、連接列表
x = [‘a’, ‘b’, ‘c’]
y = [‘apple’, 123, True]
方式一:x+y
方式二:x.extend(y)
方式一是一種相對高代價的操作,因為連接過程中創建了新列表,并且需要復制對象。
方式二是一種效率更高的操作,尤其是在構建大型列表的時候。
總結
以上是生活随笔為你收集整理的Python中的 List的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020年工业互联网行业研究报告(国盛证
- 下一篇: 老刘说NLP:焦虑被大肆贩卖下的自然语言