摘要:接下來本文將從這四個(gè)方面來介紹列表的一些常用小技巧。可能有人會(huì)對(duì)這兩種拷貝存在疑問,他們得到的列表的形式不是一樣的嘛是的,它們?cè)诳截惡蟮玫降牧斜硇问酱_實(shí)是一樣的。比較兩個(gè)列表是否是一樣的,這里的前提條件是這兩個(gè)列表對(duì)象不是同一個(gè)對(duì)象。
微信公眾號(hào):冰咖啡與狗1. 列表
一杯冰咖啡,一條狗,一個(gè)碎碎念的程序員...
不同于 C++ 和 Java,在 Python 中,沒有在標(biāo)準(zhǔn)庫中內(nèi)置數(shù)組類型,而是通常利用列表來表示數(shù)組,同時(shí)它也比數(shù)組的使用要靈活得太多。
列表是 Python 中最基本的數(shù)據(jù)結(jié)構(gòu),列表中的元素的存儲(chǔ)是有序的,所以我們可以直接利用索引去訪問列表中的值。在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí),我們知道,對(duì)一個(gè)數(shù)據(jù)結(jié)構(gòu)的操作,無外乎增刪改查四種。接下來本文將從這四個(gè)方面來介紹列表的一些常用小技巧。
1.1. 列表中的增對(duì)列表的增加操作有兩種,一種是創(chuàng)建一個(gè)新的列表,一種是在一個(gè)已有的列表中增加一個(gè)新元素。我們首先介紹如何創(chuàng)建一個(gè)新的列表:
# 創(chuàng)建一個(gè)空列表 list1 = [] # 創(chuàng)建一個(gè)默認(rèn)值為0,長度為n的列表 list2 = [0] * n # 利用列表生成式創(chuàng)建列表 list3 = [i for i in range(10)] # 5*5 二維列表 list4 = [[i for i in range(5)] for j in range(5)] # 利用其他數(shù)據(jù)結(jié)構(gòu)生成列表, list() 函數(shù)接收一個(gè)可迭代對(duì)象作為參數(shù) tuple1 = (1, 2, 3) list5 = list(tuple1) # 字符串轉(zhuǎn)化為列表 str1 = "I love code" # 每個(gè)元素作為列表中的一個(gè)元素 list6 = list(str1) # 按照指定字符分割 list7 = str1.split(" ") # ["I", "love", "code"]
在編程過程中,有時(shí)我們需要對(duì)一個(gè)列表進(jìn)行操作,但是列表是一個(gè)可變對(duì)象,對(duì)列表的操作往往會(huì)改變其本來的順序結(jié)構(gòu)。因此,當(dāng)我們不想改變列表原有的順序結(jié)構(gòu),我們需要對(duì)舊的列表進(jìn)行一個(gè)拷貝,然后在新的列表上進(jìn)行操作。拷貝存在兩種,淺拷貝和深拷貝。可能有人會(huì)對(duì)這兩種拷貝存在疑問,他們得到的列表的形式不是一樣的嘛?
是的,它們?cè)诳截惡蟮玫降牧斜硇问酱_實(shí)是一樣的。但是在進(jìn)行操作時(shí),就會(huì)有很大的差別了,特別是當(dāng)你的列表中存在可變對(duì)象時(shí)。我們只需要記住一點(diǎn),淺拷貝只復(fù)制不可變對(duì)象,而深拷貝不僅復(fù)制不可變對(duì)象,還復(fù)制了可變對(duì)象。以下進(jìn)行舉例說明:
# 如果一個(gè)列表中的元素都是不可變對(duì)象,可以直接用淺拷貝 list1 = [1, 2, "i"] list2 = list1[::1] # 淺拷貝 list3 = [i for i in list1] # 淺拷貝 import copy list4 = copy.copy(list1) # 淺拷貝 # 如果一個(gè)列表中的元素包含可變對(duì)象,要完成復(fù)制列表,需要用深拷貝 list5 = ["Will", 1, ["Python", "Java", "C++"]] list6 = copy.deepcopy(list5)
為什么在包含不可變對(duì)象的時(shí)候,需要用到深拷貝呢?
上面我們說過,淺拷貝只拷貝不可變對(duì)象。當(dāng)列表中存在可變對(duì)象時(shí),我們可以發(fā)現(xiàn)其引用 id 是一樣的,即它們是同一個(gè)對(duì)象,因此對(duì) list5 的操作會(huì)影響到 list6 。而在深拷貝中,對(duì)于可變對(duì)象,在拷貝的新列表中會(huì)生成一個(gè)新的對(duì)象,所以對(duì) list6 的修改不會(huì)影響到 list5 。
id(list5[2]) # 2195936916360 id(list6[2]) # 2195936916744
對(duì)列表的另一種增加操作就是在已有的列表的基礎(chǔ)上增加元素了,主要包括以下幾種操作:
list1 = ["I"] # 在列表尾部增加一個(gè)新元素 list1.append("love") # 合并兩個(gè)列表 list2 = ["Apple", 3] list1.extend(list2) # ["I", "love", "Apple", 3] list1 = list1 + list2 # ["I", "love", "Apple", 3] # 在指定位置插入元素 list1.insert(index=1, "not") # ["I", "not", "love", "Apple", 3]
對(duì)數(shù)據(jù)結(jié)構(gòu)的刪除操作包括兩種,刪除整個(gè)列表,或者刪除列表中的某些元素。對(duì)于從內(nèi)存中刪除整個(gè)列表,該操作十分簡單:
list1 = [1, 2, 3] del list1
對(duì)于刪除列表中的元素,同樣可以使用 del 語句,同時(shí)還可以使用 remove() 函數(shù)。
list1 = [1, 2, 3] print(list1) # [1, 2, 3] del list1[1] print(list1) # [1, 3] # 移除某個(gè)值的第一匹配項(xiàng) list2 = [1, 2, 2, 3, 5] list2.remove(2) # 移除第一個(gè)值為 2 的元素
修改操作即在原有的列表的基礎(chǔ)上對(duì)其進(jìn)行修改,上面以及介紹了增加和刪除操作,這里就對(duì)不改變?cè)氐膫€(gè)數(shù)的操作進(jìn)行介紹,主要包括排序和反轉(zhuǎn)列表等。
# 對(duì)一個(gè)整數(shù)列表進(jìn)行排序 list1 = [9, 5, 6, 2, 7, 1, 3] # 升序排列 list1.sort() # [1, 2, 3, 5, 6, 7, 9] list1 = sorted(list1) # [1, 2, 3, 5, 6, 7, 9] # 降序排列 list1.sort(reverse=True) # [9, 7, 6, 5, 3, 2, 1] list1 = sorted(list1, reverse=True) # [9, 7, 6, 5, 3, 2, 1] # 指定鍵值排序 list1 = [("a", 3), ("b", 2), ("c", 1)] list1.sort(key=lambda x:x[1]) # [("c", 1), ("b", 2), ("a", 3)] ## 反轉(zhuǎn)列表,即將原來的列表逆序排列 list2 = [4, 2, 3, 1] list2 = list2[::-1] # [1, 3, 2, 4] list2.reverse() # [1, 3, 2, 4]
對(duì)列表的查找操作無外乎以下幾種:
遍歷列表;
查找指定索引的元素;
查找指定值的元素;
列表的遍歷方式有三種,分別是根據(jù)索引遍歷、根據(jù)值遍歷和 enumerate()遍歷。
list1 = ["Python", "C++", "Java"] # 方法 1 for i in range(len(list1)): print(list1[i]) # 方法 2 , 遍歷速度最高效,但是無法記錄索引 for i in list1: print(i) # 方法 3 for index, val in enumerate(list1): print(val)
查找元素有兩種,一種是按照索引查找,一種是遍歷按值查找。
# 查找指定索引的元素 list1 = [1, 3, 2, 5, 7, 8] list1[3] # 返回索引為 3 的元素,值為5 # 查找指定值的元素 key = 5 for i in list1: if i == key: print("OK") # 查找最大元素和最小元素 max(list1) # 8 min(list1) # 1
上述介紹了列表的增刪改查四種常用操作,當(dāng)然對(duì)列表的操作不僅僅只有這些,例如還有兩個(gè)列表的比較,列表結(jié)構(gòu)的轉(zhuǎn)化等等。
比較兩個(gè)列表是否是一樣的,這里的前提條件是這兩個(gè)列表對(duì)象不是同一個(gè)對(duì)象。
list5 = [("car", 1), ("bike", 2), ("foot", 3)] list6 = [("car", 1), ("bike", 2), ("foot", 3)] # 判斷兩個(gè)列表是否是同一個(gè)對(duì)象 list5 is list6 # False # 判斷兩個(gè)列表是否相等 list5 == list6 # True # 當(dāng)列表中的元素很多,且結(jié)構(gòu)復(fù)雜時(shí),可以使用 numpy 模塊 import numpy as np a = np.array(list5) b = np.array(list6) (a == b).all() # True
列表結(jié)構(gòu)的轉(zhuǎn)化主要包括將列表轉(zhuǎn)化為元組、集合、字符串和字典:
list1 = ["a", "b", "c", "d", "c"] # 列表轉(zhuǎn)化為元組 tuple1 = tuple(list1) # ("a", "b", "c", "d", "c") # 列表轉(zhuǎn)化為集合 set1 = set(list1) # {"a", "b", "c", "d"} # 列表轉(zhuǎn)化為字符串 str1 = "".join(list1) # "abcdc" # 列表轉(zhuǎn)化為字典,元素為 key, 次數(shù)為 value from collections import Counter, defaultdict dict1 = Counter(list1) # Counter({"a": 1, "b": 1, "c": 2, "d": 1}) # 或者 dict2 = defaultdict(int) for i in list1: dict2[i] += 1 dict2 # defaultdict(int, {"a": 1, "b": 1, "c": 2, "d": 1})
歡迎掃碼關(guān)注公眾號(hào)冰咖啡與狗,一起每日進(jìn)步。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/43937.html
摘要:元組是靜態(tài)數(shù)組,它們不可變,且其內(nèi)部數(shù)據(jù)一旦創(chuàng)建便無法改變。元組緩存于運(yùn)行時(shí)環(huán)境,這意味著我們每次使用元組時(shí)無須訪問內(nèi)核去分配內(nèi)存。 以下是整理的JavaScript和python的基礎(chǔ)區(qū)別的整理: 字符串、列表、元組、字典、集合、函數(shù) 字符串 聲明一個(gè)字符串 python str = 123 str = 123 Tips: 如果是三個(gè)引號(hào)的話,那么在py中就是注釋的意思 ...
摘要:元組是靜態(tài)數(shù)組,它們不可變,且其內(nèi)部數(shù)據(jù)一旦創(chuàng)建便無法改變。元組緩存于運(yùn)行時(shí)環(huán)境,這意味著我們每次使用元組時(shí)無須訪問內(nèi)核去分配內(nèi)存。 以下是整理的JavaScript和python的基礎(chǔ)區(qū)別的整理: 字符串、列表、元組、字典、集合、函數(shù) 字符串 聲明一個(gè)字符串 python str = 123 str = 123 Tips: 如果是三個(gè)引號(hào)的話,那么在py中就是注釋的意思 ...
摘要:返回值,非必須,返回多個(gè)值使用逗號(hào)分隔即可。注意第一行末尾的分號(hào)無參數(shù)無返回值的函數(shù)該內(nèi)容將演示函數(shù)的使用便捷性。函數(shù)的返回值可以賦值給一個(gè)變量,通過打印該變量,即可知道返回的具體內(nèi)容。先學(xué)習(xí)一下局部變量與全局變量。 Python 學(xué)習(xí)的第一個(gè)難關(guān) -- 函數(shù),這個(gè)地方學(xué)會(huì)的人覺得沒有啥,沒學(xué)過的學(xué)的時(shí)候迷迷瞪...
摘要:在這里我分享下我個(gè)人入門機(jī)器學(xué)習(xí)的經(jīng)歷,希望能對(duì)大家能有所幫助。相關(guān)學(xué)習(xí)鏈接,,入門后的體驗(yàn)在入門了機(jī)器學(xué)習(xí)之后,在實(shí)際工作中,絕大多數(shù)的情況下你并不需要去創(chuàng)造一個(gè)新的算法。 機(jī)器學(xué)習(xí)在很多眼里就是香餑餑,因?yàn)闄C(jī)器學(xué)習(xí)相關(guān)的崗位在當(dāng)前市場待遇不錯(cuò),但同時(shí)機(jī)器學(xué)習(xí)在很多人面前又是一座大山,因?yàn)榘l(fā)現(xiàn)它太難學(xué)了。在這里我分享下我個(gè)人入門機(jī)器學(xué)習(xí)的經(jīng)歷,希望能對(duì)大家能有所幫助。 PS:這篇文章...
閱讀 3892·2021-11-24 11:14
閱讀 3332·2021-11-22 13:53
閱讀 3897·2021-11-11 16:54
閱讀 1581·2021-10-13 09:49
閱讀 1231·2021-10-08 10:05
閱讀 3408·2021-09-22 15:57
閱讀 1765·2021-08-16 11:01
閱讀 981·2019-08-30 15:55