python列表添加字符串_2.python基础之—列表,元组,字典,集合,字符串的使用方法...
一.關于python序列的簡介。
python里面的序列大部分都可以執行,索引,切片,加,乘,檢查長度,以及檢查某個成員是否存在,甚至還可以找出這個序列中最小的元素和最大的元素,并且序列都是可迭代的。
解釋下個人理解的迭代,迭代(iteration),序列中的迭代就是對序列中的每個元素重復執行某些操作/
具體的迭代方式后面會說到。
下面就說說python序列的共有特點。
1.索引
一個序列中,所有的元素都有自己的編號,這個編號是從0開始的,這個編號就是所謂的索引,這些元素可以通過索引來依次訪問。下面就拿字符串類型舉個例子,字符串在python中也是序列的一種。
test = "suhaozhi"
print test[0] (打印序列中的第一個元素,也就是打印字符串的第一個字符。)
s
根據上面的示例就可以看出,python中的字符串就是由字符組成的序列,索引0指向了序列中的第一個元素,在這個例子中就是s。
python中幾乎所有的序列都可以使用這種索引,如果索引是負數時,python會從右邊,也就是最后一個元素開始計數,如果想直接取序列中最后一個元素的話,可以直接使用-1。
test = "suhaozhi"
print test[-1]
i
2.分片
如果說索引一次只能訪問序列中的一個元素,那么分片就可以通過索引一次訪問序列中的一段(一個范圍的)元素。
分片操作通過冒號隔開兩個索引來實現。
假如說現在定義了一個變量,這個變量里是個字符串,字符串的內容是www.baidu.com,現在要通過分片取出前面的三個字符‘www’,操作方法如下。
url = 'www.baidu.com'
print url[0:3]
www
第一個索引“0”是要提取的第一個元素編號(開頭)而最后一個索引“3”責是分片之后!剩余部分!的第一個元素號。
分片操作的視線是需要兩個索引作為邊界,第1個索引的元素是包含在分片內的,第二個不包含在分片內。
那么假如說這個字符串的長度未知,我只想取最后三個字符,該如何操作呢?
print url[-3:]
com
如果分片獲取到的部分需要包括結尾的元素,那么后面的索引就需要為空。
這種方法也可以用在開始的元素上。
url = 'www.baidu.com'
print url[:3]
www
3.分片之步長。
在對序列進行分片的時候,開始和結束都需要指定,而另一個參數“步長”,這個參數是隱藏的,默認值是1,我們的分片操作就是按照步長來逐個遍歷序列中的元素,然后返回開始和結束點之間所有的元素。
比如說以下面這個列表為例:
我們對下面這個列表做一個分片操作。
l1 = [1,2,3,4,5,6,7,8,9,10]
現在要取這個列表中的1到9。
print l1[0:9:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
其中0:9:1前面的0:9前面已經解釋過了,是開始和結束的位置,最后一個1就是步長參數,不管這個參數寫不寫,默認就是1。
如果步長被設置為比1大的數,那么就會跳過某些元素,比如說將步長設置為2,就會出現以下效果。
l1 = [1,2,3,4,5,6,7,8,9,10]
print l1[0:9:2]
[1, 3, 5, 7, 9]
每取一個元素都會跳過一個元素。
補充一點!:步長不可以為0,但是可以為負數!如果步長設置為負數,那么就會從右向左開始取元素。
l1 = [1,2,3,4,5,6,7,8,9,10]
print l1[::-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
如果說開始的元素包括在結果之中,結束的元素,不能在分片之內,當使用一個負數作為步長的時候,開始的索引節點必須大于結束的索引!!!!對于一個正數的步長,python會從序列的頭部(左)向右開始提取元素,但是對于負數的步長,則是從序列的尾部(右)開始向左提取元素!!所以說,如果要使用負數作為步長,那么開始的索引要大于結束的索引。
4.序列之間的相加。
相同類型的序列之間是可以合并拼接起來的,只要通過+加號就可以做到。
比如說現在拼接兩個列表。
print [1,2,3] + [4,5,6]
[1, 2, 3, 4, 5, 6]
這樣,兩個相同類型的序列就拼接起來了。
字符串也是如此。
print "hamasaki" + "ayumi"
hamasakiayumi
不過需要注意,不同類型的序列是不可以拼接在一起的,比如說列表和字符串,雖然說都是序列,但是它們屬于不同的類型!!!
5.關于序列與乘法。
用數字去乘以一個序列,會生成一個新的序列,在新的序列中,原來的序列會被重復n次。
比如說:
print "suhaozhi" * 5
suhaozhisuhaozhisuhaozhisuhaozhisuhaozhi
suhaozhi被重復了5遍。
print '*' * 50
**************************************************
*號被重復了50遍。
這事關于字符串的示范,列表也是一樣。
print [1,2,3] * 10
[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
那么這種蛋疼的序列乘法永在什么位置呢?
個人理解,這種序列乘法可以用來占用序列里面元素的空間,也就是初始化,創建一個空列表[]可以用中括號來表示,但是這個列表中什么都沒有,假如說這時需要創建一個占用是個元素的空間,但是這個列表中不能有任何內容(每個元素必須是空值),這時候序列乘法就可以發揮作用了。
每個元素都需要為空,就意味著列表不可以有任何元素,這種情況就需要使用None了,None是python的內建值,就是什么都沒有的意思,因此,如果想要初始化一個長度為10的列表,但是這個列表中什么都不可以放,就可以使用下面的例子來實現。
test = [None] * 10
print test
[None, None, None, None, None, None, None, None, None, None]
6.檢查某個成員在序列中是否存在。
檢查一個元素是否在指定的序列中,可以使用in來進行檢測(關于in運算符,在前面的運算符介紹中講過了,可以查看前面的文章~),當要檢查的元素存在于這個序列中,責返回True否則返回False,下面是使用in來檢查元素是否存在于序列的例子。
比如說檢查linux/unix文件的權限(rwx)。
permissions = ''rw"
print 'w' in permissions
True
在說一個通俗易懂的例子,檢查一個用戶的名字是否在列表上。l1 = ['linhaifeng','suhaozhi','andy']
print "suhaozhi" in l1
True
名字存在于列表中就返回了True。接著在查一個列表中沒有的。l1 = ['linhaifeng','suhaozhi','andy']
print "ayumi"
沒有的元素,就直接返回了一個False
7.計算序列長度,取出序列中的最大元素和最小元素。
python中內置了len(),min(),max()這三個特別有用的函數,其中len函數可以返回序列中元素的數量,也就是這個序列的長度,min可以返回這個序列中最小的元素,max則可以返回這個序列中最大的元素。
下面演示下這三個常用函數的用法。Username = ["linhaifeng","suhaozhi","andy","tony"]
現在有個列表,需要計算這個列表中有多少個元素。print len(Username)
4
最后返回的結果是4,就說明這個列表中有4個元素。
計算序列長度的這個函數還可以永在字符串上,因為字符串也是序列的一種啊。print len("Hello")
5
返回的結果是5,就說明這個字符串中有5個字符。
len說完了,在簡單演示min和max函數。test = [1,2,3,4,5,6]
min(test)
1
查找test這個列表中最小的元素,這個最小的元素就是1。
再試試max函數。test = [1,2,3,4,5,6]
max(test)
6
min和max函數,一般情況下,用來查找序列中的數字,如果是英文字符串的話,是按照首字母排序去進行查找的。
補充!:在這補充一點,min和max函數不只可以用于單個序列中找出最大值和最小值,這兩個函數可以同時接收多個參數,在多個參數中找出最大值和最小值。print min(1,2,3,4,5,6)
1print max(1,2,3,4,5,6)
6
二.細說python列表(list)。
基本序列所具有的功能,列表都具備,索引,分片,連接,乘法列表都可以,和字符串不同的是,列表是可以修改的,列表支持,添加元素,插入元素, 刪除元素,甚至還可以分片賦值,然而前面說的那些列表支持的功能,字符串都不能做。
1.修改列表中的元素。
想要修改列表中的某個元素,需要借助元素的索引才可以去修改,想去修改一個元素,必須明確這個元素的位置,索引。test_list = ["aaa","bbb","ccc"]
假如說,現在要給上面那個列表中的第0個元素“aaa”替換為“suhaozhi”,下面就是操作方法。test_list[0] = "suhaozhi"
print test_list
['suhaozhi', 'bbb', 'ccc']
這個列表中的第0個元素就被成功修改為“suhaozhi”了。
2.列表之分片賦值。
個人覺得列表的分片賦值功能做的特別的屌,分片賦值就是把修改列表中元素和分片聯合起來使用。
前面介紹了,字符串雖然也是序列的一種,但是字符串這種序列是不支持修改的,那怎么讓這種序列變得可以修改呢?這個時候就可以用到列表的分片賦值功能,其實分片賦值就是通過索引分片,然后在通過索引去修改列表中的元素,下面來做個演示~~name = "perl"
首先我們定義了一個變量,這個變量中存的是個字符串“perl”,現在要對這個字符串序列的最后三個字母進行修改,把這個字符串變成python,操作方法如下。name = list("perl")
#首先使用list()工廠函數,將perl這個字符串強制轉換成列表的格式,轉換后,我們先在屏幕上輸出下這個轉換后的列表看看。print name
['p', 'e', 'r', 'l']
轉換成功后,通過之前說的分片和索引,去修改列表中的元素。name[1:] = list("ython")
print name
#然后我們來打印一下這個列表看下。
['p', 'y', 't', 'h', 'o', 'n']
#列表中的元素已經替換完成了,接下來需要做的就是,使用join()方法,把列表中的每個元素合并為一個字符串。print "".join(name)
python
3.刪除一個元素。
從列表中刪除一個元素,可以使用del語句來實現。test_list = ["aaa","bbb","ccc"]
現在需要刪除這個列表中的第二個元素(從第0個開始數)。del test_list[2]
print test_list
['aaa', 'bbb']
第二個元素“ccc”就被刪掉了。
關于del語句~在這里需要特別補充一下!!
del語句不只可以刪除列表中的元素,甚至還可以刪除其他元素,還可以刪除變量!!
4.python中列表中常用方法介紹。
在介紹列表的常用方法之前,先說一個關于函數和方法的概念,方法這個東西確實和函數看起來有點類似,但是是不一樣的,但是“方法”是需要“類”去調用的,這個“類”可能是數字,也可能是字符串,列表,活著其他對象,但是函數是可以直接使用的,這就是它們的不同,舉個例子。
當函數被加載到內存后,直接 函數名后面加上括號就可以使用了,就像這樣 func_name()。
而方法呢是需要通過對象去調用的,比如 對象名.方法(參數)。
下面開始正式介紹列表的常用方法啦。
4.1 append用于在列表的尾部追加一個新的元素。l1= [1,2,3]#在列表尾部添加一個新的元素4
l1.append(4)print test
[1, 2, 3, 4]
注意!!!在這里有個特別注意事項,就是append方法并不是簡單的返回一個修改過的新列表,而逝把原來的舊列表直接進行操作!!!!
4.2 count 統計一個元素在列表中出現的次數。
列表中的元素是可以重復的,count方法可以統計一個元素在這個列表里重復出現了多少次。
下面是例子。test = ["suhaozhi","linhaifeng","linhaifeng"]
這個列表中有一個“suhaozhi”兩個“linhaifeng”,用count方法就可以找出這個列表中有多少個linhaifeng。print test.count("linhaifeng")
2
返回的數值是2,就說明有2個。
4.3 extend 拓展列表,可以一次性在列表的末尾追加n個值,還可以用一個新的列表去拓展原有的列表。lia= [1,2,3]
lib = [4,5,6]
現在有lia和lib兩個列表,現在要將lib列表中的所有元素全部添加到lia的尾部。lia.extend(lib)
添加完成后,我們再來看看lia列表。print lia
[1, 2, 3, 4, 5, 6]
關于extend方法有個很重要的知識點需要補充!!!!!
還記得之前說的使用+加號去連接兩個相同的序列嗎?[1,2,3] + [4,5,6] extend方法和這種拼接的加號看起來作用很相像,但是本質上完全不同!!!!!extend方法會修改原有的列表!!!而加號拼接則不回修改原列表,會返回一個全新的列表!!!!這兩個地方千萬不要弄混!!
4.4 index 返回指定元素的索引。
index方法用于從列表中找出第一個匹配的元素的索引位置。lia = [1,2,3,"suhaozhi","andy","suhaozhi"]print lia.index("suhaozhi")
3
在搜索suhaozhi的時候,就會發現它在索引為3號的位置,這個列表中有兩個“suhaozhi”但是index方法會從列表的左側開始找,如果找到了,直接返回結果,不在向下匹配了。
如果找不到指定的元素,那么index方法就會拋出一個異常。
4.5 insert 將指定的對象按照指定的位置插入到列表中。li1 = [1,3,5,7,9]
這有個列表,現在想把字符串“two”,插入到索引為1的位置,也就是1和3的中間。li1.insert(1,"two")print li1
[1, 'two', 3, 5, 7, 9]
4.6 pop 彈出,從列表中彈出一個元素,默認彈出最后一個,但是可以通過索引來指定具體彈出哪個元素。
在這解釋下彈出是什么意思,彈出就是從列表中刪除一個元素,在這個元素被刪除時,被刪除的這個元素會作為執行這個方法的返回值。
下面是關于pop方法的操作:li1 = [1,2,3,4]
l11.pop()
print li1
[1, 2, 3]
這個列表最末尾的元素4被彈出了。
接下來我們手動指定彈出第0個元素。l1 = [1,2,3]
l1.pop(0)
print l11
[2, 3]
第0個元素就從列表中被彈出了。
這個pop方法在什么情況下會使用呢?
在實現后進先出(LIFO)隊列的時候,pop方法就發揮出它的用處了。
在這介紹下什么是LIFO后進先出隊列,后進先出隊列,也被稱為,“堆棧”,就好像堆盤子,在拿盤子的時候,一次只能從頂部拿一個盤子,也就是說最后放的盤子,會被最先拿走,同樣,最后被放入隊列,最先從隊列中移除,這就是堆棧,LIFO后進先出隊列。
接下來我們驗證下pop是否具有彈出的功能,能否實現“堆棧”。l1 = [1,2,3]
l1.append(l1.pop())
print l1
[1, 2, 3]
li1.pop()先被執行,最末尾的元素3被彈出,被彈出后作為返回值被li1.append()方法又一次放回到了li1列表的尾部,這樣就實現了“堆棧”,以后在需要后進先出隊列的時候,就可以使用列表的pop方法來實現。
4.7 remove移除,從列表中移除一個元素,但是沒有返回值~
remove方法可以用來移除列表中第一個匹配到的元素。l1 = ['linhaifeng','suhaozhi','linhaifeng']
l1.remove('linhaifeng')
['suhaozhi', 'linhaifeng']
從上面的例子就可以看到,只有第一次被匹配到的元素被刪除了。
當使用remove刪除一個不存在的元素,則會直接拋出異常!
remove和pop最大的區別就是,remove刪除一個元素是沒有任何返回值的。
4.8 reverse 倒序,將列表中存放的元素,按照和原來相反的順序進行排序。test = [1,2,3]
test.reverse()
[3, 2, 1]
特別注意!!!如果需要做反向的迭代操作,有個專門做反向迭代的函數,也叫reverse()這個reverse函數和列表中帶的reverse方法是有區別的,如果需要做反向迭代操作,強烈推薦reverse函數,這個函數返回的不是一個列表,而是一個迭代器(iterator)對象,直接放到循環中進行反向迭代。
(經過測試,直接使用list()函數強制把返回的迭代器轉換成列表也是可以的。)
4.9 sort 排序。
使列表中的元素按照一定順序去排列,sort方法也是直接就該列表本身的。test = [2,1,3]
test.sort()
[1, 2, 3]
關于sort方法也需要額外的補充一下,如果不想對原列表進行修改,想生成一個排序后的新的副本,那么sorted()函數是最好的選擇,sorted()函數會將排序后的列表生成一個新的列表。
sorted函數雖然可以針對各種序列進行排序,但是返回值卻永遠都是以列表的形式print sorted("dcba")
['a', 'b', 'c', 'd']
#python中列表中元素的排序方式還可以自己指定,本篇文章主要是說明,列表,元組,字典之類的使用方法,關于排序后面會單獨有一篇文章做介紹。
三.python元組(tuple)的使用。
元組合列表非常類似,但是它們最大的區別就是元組是不可變的,不能做任何修改,生成元組的方法特別簡單,只要使用逗號(,)分隔了一些值,就自動創建了元組。t1 = 1,2,3,4
print type(t1)
print t1
(1, 2, 3, 4)
元組也支持分片,方法和列表一模一樣,這個就不多介紹啦。
元組分片后還是元組。
既然列表比元組的功能還多,那么要元組有毛用?
上網找了好多資料,終于知道元組為什么不可替代了。
元組可以在創建字典時作為key使用,列表卻不行。
四.python字符串的基本使用(str)。
在本篇文章中,不對字符串格式化做介紹,只介紹關于字符串的一些常用方法,關于字符串格式化,后面會單獨寫一篇文章。
下面介紹一些比較常用的字符串方法(字符串的方法實在太多了,在這里說些常用的吧。)
1.find()在字符串中,查找想要找的子串。
它會返回子串從左數第一個位置的索引,如果沒有找到對應的子串則會返回-1。
s1 = 'maybe you to'
print s1.find("you")
6
find方法不會返回布爾值,如果返回值是0,責說明了在第0位置的索引找到了子串。
補充一個find方法的用法,find方法還支持按字符串的指定范圍查找子串。
比如說查找字符串y,如果不傳任何參數的話,直接在maybe中就可以找到y。s1 = 'maybe you to'
print s1.find('y')
2
在第2個索引的位置,找到了y,然后就不在繼續找了,接著我們指定下索引的范圍讓find從第6個索引開始找,找到第9個索引。
s1 = 'maybe you to'
print s1.find('y',6,9)
6
我們可以手動指定find方法的查找范圍,從哪個索引的字符串開始,從哪個索引的字符串結束。
‘y’是要從字符串中查找的子串,6指從第6個索引開始,9是指從第9個索引開始結束。
2.join 拼接,是字符串中非常非常重要和常用的方法。
主要的功能是用來拼接序列中的元素,讓序列中的元素使用指定的字符串連接起來。
注意!join方法只可以拼接字符串!!!其他的序列是無法拼接的,數字也不行!!
l1 = ['1','2','3','4','5','6']
這個列表中所有的數字已經使用單引號轉換成了字符串。
現在需要做的就是使用+-將l1列表里所有的元素連接成一個字符串。
print "+-".join(l1)
1+-2+-3+-4+-5+-6
3.lower小寫,將字符串中所有的字符全部轉換為小寫。
如果想要做這種“不區分大小寫”的功能的話,這個方法就派上用場了,無論大寫小寫,全部轉換為小寫。
在python中,是嚴格區分大小寫的,假如想要在列表中查找一個元素是否存在,比如說在列表中找到字符串為“guilty“的元素,但是用戶輸入的是GUILTY,由于python會嚴格區分大小寫,就會導致指定的元素找不到。
下面是關于大小寫的測試代碼。
name = "GUILTY"
test = ["suhaozhi","guilty"]
if name in test:
print "ok"
else:
print "not found!"
not found
列表中命名有guilty這個元素,因為大小寫的問題,現在找不到。
接下來就使用lower方法,對字符串做個轉換。
name = "GUILTY".lower()
test = ["suhaozhi","guilty"]
if name in test:
print "ok"
else:
print "not found!"
ok
這樣,指定的元素就找到了。
print "GUILTY".lower()
guilty
在這里看到字符串成功的被轉換成小寫。
4.replace 替換,替換字符串中指定的子串。
這個方法,沒有什么好說的,功能就是字符串替換,下面是例子。
s1 = "i have a pen"
print s1.replace("pen","apple")
i have a apple
5.split 拆分,也是特別重要和常用的一個字符串方法,將字符串按照指定的格式進行拆分,并且以列表的方式返回。
s1 = '1+-2+-3+-4+-5+-6+-7'
將上面的字符串以+-為分隔符拆分。
s1 = '1+-2+-3+-4+-5+-6+-7'
print s1.split('+-')
['1', '2', '3', '4', '5', '6', '7']
補充~在使用split做拆分的時候,如果不指定分隔符,默認責會使用空格,制表符,換行符作為分隔符。
split方法中,還可以指定最大的拆分次數,做多可以拆多少次,假如說,最多只拆分兩次,可以在加個參數2
s1 = '1+-2+-3+-4+-5+-6+-7'
print s1.split('+-',2)
['1', '2', '3+-4+-5+-6+-7']
上面那個字符串被拆成了三個元素,前兩個+-被當作拆分符拆了兩次。
6.strip脫掉...去除字符串兩側的字符,一般情況下,經常用這個方法來去掉換行符和空格。
s1 = "+aaa+"
print s1.strip('+')
aaa
字符串兩邊的+加號被去掉了。
strip只能去掉字符串兩邊的多余字符,對字符串中間的字符不生效。
這個方法也很常用,用來去掉空格和換行符特別管用!!!!
五.python字典(dict)的基本使用方法。
當數字索引不好用的時候,就可以考慮使用字典啦。
字典是python中唯一的映射類型,字典中的值沒有特殊的順序,都是存儲在特定的key下,key可以是數字,可以是字符串,也可以是元組。
下面是字典的創建和使用字典。
字典是由多個鍵值對組成的,每個key(鍵)和它的value(值)都是用:冒號分隔,每個鍵值對之間都使用逗號分隔,最外層使用大括號括起來{}。
下面是python字典的結構。
dict1 = {"k1":"v1","k2":"v2","k3":"v3"}
python字典的創建方法。
方法1:最常規的字典創建方式。
dict1 = {"k1":"v1","k2":"v2","k3":"v3"}
方法2:使用元組影射。
items = [('name','suhaozhi'),('age',22)]
d1 = dict(items)
print d1
{'age': 22, 'name': 'suhaozhi'}
方法3:通過關鍵字來創建字典。
d1 = dict(name = 'suhaozhi',age = 22)
print d1
{'age': 22, 'name': 'suhaozhi'}
創建空字典:
d1 = {}
d1 = dict()
1.字典的基本操作。
字典不屬于序列,但是它的操作方法和序列很類似。
1.1查看字典有多少鍵值對。
如果想要查看一個字典里有多少鍵值對,使用len()函數就可以查到。
dict1 = {"k1":"v1","k2":"v2","k3":"v3"}
print len(dict1)
1.2獲取字典中某個key對應的value。
print dict1['k1']
v1
注意!這種獲取vlaue的方式不推薦,因為一旦找不到指定的key,程序又會拋出異常,推薦使用字典中的get方法去獲取vlaue,get方法后面會介紹!!
1.3對字典中指定的key賦值。
dict1 = {"k1":"v1","k2":"v2","k3":"v3"}
dict1['k4'] = 'v4'
print dict1
{'k3': 'v3', 'k2': 'v2', 'k1': 'v1', 'k4': 'v4'}
1.4刪除字典中指定的鍵值對。
要刪除字典中的某個鍵值對,只需要指定鍵(key)就可以刪除了。
dict1 = {"k1":"v1","k2":"v2","k3":"v3"}
del dict1["k1"]
print dict1
{'k3': 'v3', 'k2': 'v2'}
1.5檢查字典中是否存在指定的key。
dict1 = {"k1":"v1","k2":"v2","k3":"v3"}
print 'k3' in dict1
True
2. 關于創建字典的一些注意事項。
key的類型,需要注意,字典的key可以是任意的不可變類型,可以是字符串,可以是浮點數,也可以是數字,也可以是元組,只要是不可變的類型都可以做字典的key。
字典的鍵值對是可以自動添加的,即使某個key在字典中并不存在,只要直接給key賦值,python就會去創建這個key(所以字典沒有append方法就是因為這個原因)。
3.字典(dict)的常用方法。
3.1 clear清除,該方法可以清除字典中所有的項,無任何返回值。
dict1 = {"k1":"v1","k2":"v2","k3":"v3"}
dict1.clear()
print dict1
注意啦!!其實clear方法看起來很普通,清空了字典里所有的key和value,這些定義一個空字典也可以做到,但這并非真正的刪除,clear可以做到真正意義上的刪除!下面是示例。
第一種情況:
d1 = {}
#首先創建了一個空字典。
d2 = d1
#創建了一個d2變量,把內存地址指向d1
d1['k1'] = 'v1'
#給d1字典創建了一個鍵值對
print d2
{'k1': 'v1'}
#新創建的那個鍵值對在變量d2上也可以看到,這是因為,d1和d2使用了指向了同一個內存地址,不相信的話,可以使用id()函數去查看!
d1 = {}
#從新給d1變量賦值了一個空字典,注意!!這并不是刪除,而是改變了d1變量原來的內存地址!!!
d1的新內存地址指向了一個空字典。
print d2
{'k1': 'v1'}
#然而d2的內存地址沒有像d1那樣發生變化,指向的還是原來的那個位置,所以,之前的鍵值對并沒有刪除,還在內存空間中沒有釋放,如果想真正的刪除,就需要使用clear方法。
下面是使用clear方法去清空字典,和上面那種所謂的“刪除”做個比較。
d1 = {}
d2 = d1
d1['k1'] = 'v1'
print d2
{'k1': 'v1'}
d1.clear()
print d2
{}
所以說,clear才是真的清除。
3.2 copy 淺復制,返回一個具有相同鍵值對的新字典。
首先先舉一個不使用copy方法,直接靠變量之間賦值實現所謂的“復制”!
d1 = {'k1':'v1','k2':'v2'}
d2 = d1
print d1
{'k2': 'v2', 'k1': 'v1'}
print d2
{'k2': 'v2', 'k1': 'v1'}
看起來像是通過變量間賦值的方式,實現了一個類似“復制”的效果,其實這并不是真正的復制,具體原因,看下面的操作就明白了。
接下來,我們給d1增加一個鍵值對。
d1['k3'] = 'v3'
雖然改變的是d1變量中的字典,但是!d2中的字典也會發生同樣的改變!!
print d1
{'k3': 'v3', 'k2': 'v2', 'k1': 'v1'}
print d2
{'k3': 'v3', 'k2': 'v2', 'k1': 'v1'}
修改了d1,d2也發生了同樣的改變,這是因為d1和d2同時指向了一個內存地址,這兩個變量使用的是相同的內存空間,這一點是可以通過id函數看到的。
print id(d1)
4481913472
print id(d2)
4481913472
這兩個變量使用的內存地址是一模一樣的!!!
下面是copy方法的使用示例。
d1 = {'k1':'v1','k2':'v2'}
d2 = d1.copy()
#使用copy方法,去復制字典
d2['k3'] = 'v3'
#修改復制后的字典,給新字典增加一個鍵值對。
print d1
{'k2': 'v2', 'k1': 'v1'}
print d2
{'k3': 'v3', 'k2': 'v2', 'k1': 'v1'}
#從這可以看出,修改了新字典后,對新字典進行修改,完全沒有影響到d1變量。
#這是因為d2現在是一個獨立的個體,d1和d2復制后內容雖然一樣,但是分別使用的是不同的內存空間,下面使用id函數去查看一下
print id(d1)
4537868928
print id(d2)
4538835584
注意!!字典中的copy方法只是淺拷貝,只會拷貝父級對象,如果字典中有子對象(字典中嵌套了字典,或者嵌套了列表,就是子對象。)
下面來測試一下。
d1 = {'k1':'v1','k2':'v2','k3':[1,2,3]}
d2 = d1.copy()
print d1
{'k3': [1, 2, 3], 'k2': 'v2', 'k1': 'v1'}
print d2
{'k3': [1, 2, 3], 'k2': 'v2', 'k1': 'v1'}
#k3這個key對應的值是一個列表,這個列表在字典中就是個子對象,現在在這個列表中追加一個元素。
d2['k3'].append(4)
#這時,我們查看一下d1和d2字典都發生了哪些變化。
print d1
{'k3': [1, 2, 3, 4], 'k2': 'v2', 'k1': 'v1'}
print d2
{'k3': [1, 2, 3, 4], 'k2': 'v2', 'k1': 'v1'}
#修改了一個字典中的子對象后,副本的子對象也發生了變化。
這說明了一個問題,就是copy方法只會復制字典中的父級對象,子對像其實并沒有復制,而是兩個字典中的key同時指定了同一個內存空間!!
如果想要使字典中的子對象也得到獨立的復制,則可以使用copy模塊中的deep copy(深度復制)。
想要做這種深度復制,需要導入一個copy模塊中的deepcopy函數。
from copy import deepcopy
d1 = {'k1':'v1','k2':'v2','k3':[1,2,3]}
d2 = deepcopy(d1)
d2['k3'].append(4)
print d1
{'k3': [1, 2, 3], 'k2': 'v2', 'k1': 'v1'}
print d2
{'k3': [1, 2, 3, 4], 'k2': 'v2', 'k1': 'v1'}
3.3 fromkeys()使用指定的鍵,建立一個新的字典,并且給每個key賦予一個默認的value,如果不指定value,默認為None。
d1 = dict.fromkeys(['name','age'])
print d1
{'age': None, 'name': None}
我們還可以手動指定默認值。
d1 = dict.fromkeys(['name','age'],"aaa")
print d1
{'age': 'aaa', 'name': 'aaa'}
#每建立了一個鍵值對,值默認等于aaa。
3.4 get()用于訪問字典key對應的值,d2['k3']和這種取值方式很類似,但是get這種方法在取值時,如果遇到了找不到的key,則不會拋出任何異常。
如果遇到了在字典中找不到的key,默認會返回None,我們還可以手動去指定get方法的返回值。
d1 = {'name':'suhaozhi','age':22}
print d1.get('name')
suhaozhi
d1 = {'name':'suhaozhi','age':22}
#接下來查找一個字典中不存在的key,看看會返回什么。
print d1.get('aaaa')
None
#當找不到指定的key時,默認會返回None,我們還可以手動指定返回值。
#當現在需要指定,去找一個不存在的key,如果找不到返回字符串null。
d1 = {'name':'suhaozhi','age':22}
print d1.get('aaaa','null')
null
3.5 has_key 檢查key,檢查字典中是否存在指定的key,也可以使用in去檢測,這兩個是一模一樣的。
3.6 items 將字典所有的項,以列表的方式返回,列表中嵌套的是元組,每一個鍵值對都包含在同一個元組中。
d1 = {'name':'suhaozhi','age':22}
print d1.items()
[('age', 22), ('name', 'suhaozhi')]
3.7 iteritems 和items方法類似,但是iteritems方法返回的是個迭代器,不是列表。
如果需要做迭代操作的話,強烈推薦iteritems方法!因為它更高效!!!。
3.8 keys 返回一個字典中所有的key,以列表的形式返回。
d1 = {'name':'suhaozhi','age':22}
print d1.keys()
['age', 'name']
3.9 iteritems 和key類似,返回的也是一個字典中所有的key,以迭代器的方式返回。
3.10 pop 彈出,彈出字典中指定鍵值對,通過key來指定。
(之前在list里面說過了,這里的彈出指的就是刪除,并返回。)
d1 = {'name':'suhaozhi','age':22}
print d1.pop('name')
suhaozhi
print d1
{'age': 22}
3.11 popitem 隨機彈出,隨機彈出字典的鍵值對,以元組的方式返回,刪除的順序是隨機的!
d1 = {'name':'suhaozhi','age':22}
print d1.popitem()
('age', 22)
print d1
{'name': 'suhaozhi'}
3.12 setdefault 和get方法很像,用來獲取指定key對應的值,當key不存在時,默認返回None,也可以手動指定返回值,基本上功能和get一樣,不演示了。
3.13 update 使用一個字典更新另外一個字典,舊字典的內容會更新到新字典中,如果有相同的key,對應的值會被覆蓋!!
d1 = {'name':'suhaozhi','age':22}
d2 = {'k1':'v1','k2':'v2','age':130}
d1.update(d2)
print d1
d2字典中的鍵值對,被更新到了d1字典中,相同的key被覆蓋了。
3.14 values 獲取字典中所有的值 ,以列表的方式返回。
d1 = {'name':'suhaozhi','age':22}
print d1.values()
3.15 itervalues 獲取字典中所有的值,返回的是迭代器。
六.python集合(set)。
set集合中,每一個元素都是可hash的,在這個集合中是唯一的,不能重復,而且每個元素之間是無序的。
如何可以體現出set集合中每個元素的唯一性。
首先定義一個列表
[1,1,2,2,3,3,4,4,5,5,6,6]
將這個列表轉換為set集合。
print set([1,1,2,2,3,3,4,4,5,5,6,6])
set([1, 2, 3, 4, 5, 6])
轉換成集合之后,重復的元素被去掉了。
1.python集合中常用的方法。
1.1 add 在集合中添加一個元素。
s1 = set()
s1.add("suhaozhi")
print s1
set(['suhaozhi'])
1.2 update 將一個序列進行拆分,然后分別傳入到集合中。
s1 = {"suhaozhi"}
s1.update([1,2,3,4,5])
print s1
set([1, 2, 3, 4, 5, 'suhaozhi'])
1.3 remove 移除一個元素。
s1 = {'suhaozhi',1,2,3,4,5,6}
s1.remove('suhaozhi')
print s1
set([1, 2, 3, 4, 5, 6])
集合中的suhaozhi被移除了。
1.4 issubset 用來測試,本集合中的每個元素是否都在另外一個集合中,也可以理解為另外一個集合是否包含本集合的所有元素。(以本集合為基準)
s1 = {'suhaozhi',1,2,3,4,5,6}
s2 = {6,5,4,3,2,1,'suhaozhi',222}
print s1.issubset(s2)
True
s2 中之要包含s1中所有的元素,返回結果就為真。
這個方法還可以使用兩個符號代替,個人認為符號更容易記住。
s1.issubset(s2)可以寫成這樣 s1 <= s2
這兩種語法的作用一模一樣。
1.5 issuperset 和issubset方法類似,只不過方向上是相反的,另外一個集合中的每個元素是否包含在本集合中,也可以理解為本集合是否包含另外一個集合的所有元素。(以另外一個元素為基準)
s1 = {'suhaozhi',1,2,3,4,5,6}
s2 = {6,5,4,3,2,1,'suhaozhi',222}
print s1.issuperset(s2)
False
s1.issuperset(s2) 可以寫成這樣 s1 >= s2
這兩種語法的作用也是一模一樣的。
1.6 union 返回一個新的集合,這個集合中包含了兩個集合中所有的元素,就是將兩個元素融合。
s1 = {1,2,3}
s2 = {2,3,4}
print s1.union(s2)
set([1, 2, 3, 4])
union方法還可以使用|豎線代替。
s1 | s2 和 s1.union(s2) 功能是一樣的。
1.7 intersection交集,取兩個集合共同存在的元素。
s1 = {1,2,3}
s2 = {2,3,4}
print s1.intersection(s2)
set([2, 3])
s1.intersection(s2) 可以寫成s1 & s2
1.8 difference差集,以本集合為中心,返回本集合有,但另一個集合沒有的元素。
s1 = {1,2,3}
s2 = {2,3,4}
print s1.difference(s2)
set([1])
s1.difference(s2) 可以寫成 s1-s2
1.9 symmetric_difference 返回一個新的集合,這個集合中,包含本集合和另一個集合不重復的元素。
s1 = {1,2,3}
s2 = {2,3,4}
print s1.symmetric_difference(s2)
s1.symmetric_difference(s2) 可以寫成s1 ^ s2
1.10 copy 集合的淺復制,和字典的用法一樣,在這就不做演示了。
1.11discard 如果存在就刪除,如果當前集合中存在某個元素,發現存在就移除。
s2 = {2,3,4}
s2.discard(4)
print s2
set([2, 3])
1.12 pop 彈出集合中的一個元素,如果集合中沒有元素可以彈出了,則拋出一個異常。
這個和列表的pop很類似,在這就不做演示了。
1.13 clear 真正意義上清空集合中的所有元素。
1.14 剩余的一些方法的補充。
intersection_update ,difference_update,symmetric_difference_update這些方法和intersection ,difference,symmetric_difference,基本上都是一樣的,只不過帶有update字樣的方法會對原有集合進行操作,不帶update的會生成一個新的集合。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python列表添加字符串_2.python基础之—列表,元组,字典,集合,字符串的使用方法...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opcua 入门简介 java_大二的学
- 下一篇: python函数定义和调用_函数定义和调