python自帶了四種數(shù)據(jù)結構:列表、字典、元組、集合,本章主要介紹第一種:列表。
列表:有序的、可變的對象集合
動態(tài)的:長度可以隨時變化
異構的:數(shù)字與字符串等不同類型的變量可以存在一個列表里
元組:有序的、不可變的對象集合
簡單來說就是一個常量列表。
字典:無序的鍵值對集合
就類似C++里面的map。注意字典增加元素的插入順序沒有任何意義。在一個字典中,鍵的值是唯一的。
集合:無序的、唯一對象的集合
類似C++中的set。但是是沒有順序的。
1、in操作符
使用in操作符來判斷某個集合中是否存在某元素。
使用not in操作符來判斷某個集合中是否不存在某元素。
這就和STL中的exist函數(shù)類似,使用方法為
if a in A:
print(a)
if a not in B:
print(a)
和if搭配使用。
2、列表的函數(shù)
append函數(shù):
類似push函數(shù),負責在列表的尾端添加元素。
remove函數(shù):
參數(shù)為列表中元素的值,其效果為刪除該值的第一次出現(xiàn),也就是說,對于12233355這樣一個列表,執(zhí)行remove(5)之后列表會變?yōu)?223335,第一個5被刪除了。
pop函數(shù):
比C++的pop函數(shù)功能要強大。首先,默認沒有參數(shù)的pop函數(shù)不但會刪除列表的最后一個元素,而且會返回該元素的值;其次,若pop有一個參數(shù),它會刪除在參數(shù)位置的元素,并返回其值。也就是說,pop的參數(shù)就是元素的下標,也就是索引值。
extend函數(shù):
用于合并兩個列表,其參數(shù)就是一個列表。若參數(shù)是空列表,則不會有任何改變,與之形成對比的則是append函數(shù),它的參數(shù)如果是一個空列表“[]”,那么就會在原來列表的尾巴加一個空列表。
insert函數(shù):
有兩個參數(shù),第一個參數(shù)是索引值,第二個參數(shù)是元素值。其用途就是新建一個列表元素,其值是參數(shù)中的元素值,把這個列表元素插到索引值之前。
3、練習
書中給出了一個練習,僅使用以上四個函數(shù),將字符串“Don't panic!”轉換為“on tap”。
我的代碼如下:
phrase="Don't panic"
plist=list(phrase)
print(phrase)
print(plist)
delspace=plist.pop(5)
plist.remove('D')
plist.remove("'")
deln=plist.pop(1)
plist.remove('n')
plist.remove('i')
plist.remove('c')
plist.insert(1,deln)
plist.insert(2,delspace)
dela=plist.pop()
plist.insert(4,dela)
new_phrase=''.join(plist)
print(plist)
print(new_phrase)
問題就是刪除或者掉換一些元素的位置。
基本思路就是把空格、n、a用pop提取出來并保存,因為它們都是要調換位置的;剩余的該刪的,就用remove刪了,不刪的就留下。然后用insert再重新插入。很麻煩。
推薦代碼如下:
phrase="Don't panic"
plist=list(phrase)
print(phrase)
print(plist)
for i in range(3):
plist.pop()
plist.pop(0)
plist.remove("'")
plist.extend([plist.pop(),plist.pop()]
plist.insert(2,plist.pop(3))
new_phrase=''.join(plist)
print(plist)
print(new_phrase)
首先,它用一個循環(huán),利用pop刪除了末尾的三個元素;然后利用pop刪除頭元素;這些都還好;我覺得值得學習的一句如下:
plist.extend([plist.pop(),plist.pop()]
這句話的效果是把ont pa變成了ont ap,也就是說,交換了最后兩個元素的位置,這里應用了pop會返回元素值的特點,利用兩次pop,返回了兩個值,當然它們的順序與在列表中返回了,然后用[]打包一下,用extend函數(shù)直接合并即可。十分簡潔。
這里的join函數(shù)可以理解為把列表轉換成了字符串。list函數(shù)把字符串轉換成了列表。
4、列表的復制
注意,python中,有兩種,第一種是直接使用=,如下:
A=[1,2,3]
B=A
這種情況下,B相當于一個指針,指向A,按C++來說,B是A的引用,也就是說,如果對B進行操作,也就是對A進行了同樣的操作。
第二種是使用copy函數(shù),如下:
A=[1,2,3]
B=A.copy()
這種情況下,copy函數(shù)類似C++中的拷貝構造函數(shù),也就是說把A的一份復制給B,這樣對B的操作也就不會影響到A了。
5、列表的索引
列表可以用中括號記法,當索引值為正數(shù)時,這與其他語言類似;但是索引值也可以為負數(shù),當索引值為負數(shù)時,表示從后往前數(shù)。也就是說,A[-1]表示列表A的最后一個元素,-2代表尾二等。
類似range,列表也可以用start、stop、step這三個參數(shù),但是在range中它們使用,隔開,列表的[]中,它們使用:隔開。
如果使用這種記法,相當于是一個函數(shù),返回符合要求的一部分。
有以下幾種用法:
A="Don't panic!"
A[0:10:3]#返回D'pi
A[3:]#返回't panic!
A[:10]#返回Don't pani
A[::2]#返回Dntpnc
當三個參數(shù)都有值時,按參數(shù)內容控制返回;三參數(shù)的默認值為0,列表允許的最大值,1。
當只有start有值時,僅需[start:]即可,只需一個冒號:,如果start為正,則代表著從前往后數(shù)第start個元素開始,一直到最后為止,如果start為負,則代表著從后往前數(shù),第-start個元素開始,一直到最后為止,注意不是最前;
當只有stop有值時,僅需[:stop]即可,也只需一個冒號:;
當只有step有值時,則需[::step],需要兩個冒號::。
另外,python的注釋是用#,單行注釋;""",三雙引號,多行注釋;''',三單引號,多行注釋的。
在python2中,如果代碼中有中文,還要在開頭加coding=utf-8,但python3中就不用了。
使用這種方法返回的列表的一部分,稱為列表的“切片”。
6、練習
類似上一個練習,再次把"Don't panic!"轉換為"on tap"。
我的代碼如下:
phrase="Don't panic!"
plist=list(phrase)
print(phrase)
print(plist)
plist1=plist[1:3]
print(plist1)
plist2=plist[5:3:-1]
print(plist2)
plist3=plist[7:5:-1]
print(plist3)
plist1.extend(plist2)
plist1.extend(plist3)
plist=plist1.copy()
phrase=''.join(plist)
print(plist)
print(phrase)
我的思路就是,拿出三個切片,然后利用extend合并。
有一點要注意,extend沒有返回值,因此如果寫出了plist=plist.extend(plist1)這種代碼,編譯器會報錯。因為這會將plist變?yōu)榭眨@樣它就不再是一個列表,也就沒有insert等函數(shù)了。
推薦代碼如下:
phrase="Don't panic!"
plist=list(phrase)
print(phrase)
print(plist)
new_phrase=''.join(plist[1:3])
new_phrase=new_phrase+''.join([plist[5],plist[4],plist[7],plist[6]])
print(plist)
print(new_phrase)
僅用了兩行,但它并沒有更改plist的內容,僅是新建了一個變量,然后print這個變量。
使用了兩次join函數(shù),第一次拿出了on,第二次利用運算符+連接兩個字符串,join的參數(shù)是一個列表,列表的元素則是四個plist列表的元素,將它們一個一個從plist中拿出,然后合成一個新的列表,再轉換成字符串,然后連接。
這就相當于利用下標直接提取元素,我蠢了,只會笨比的的用切片,實際上直接利用下標更簡單。
這也可以看出,python十分不喜歡用臨時變量。要注意這一點。
7、列表的迭代
有兩種方式,類似for循環(huán)的兩種方式。
第一種就像for a in A,循環(huán)自己知道,是從列表的第一個元素開始,循環(huán)到最后一個元素位置,不用我們去告訴它任何事。
第二種是對切片循環(huán),也就是for a in A的切片,本質上與上一個也一樣,因為A的切片返回的也是一個列表。
舉例如下的代碼:
A="Hello world!"
for char in A[:-3]:
print('\t',char)
print()
for char in A[-7:]:
print('\t'*2,char)
print()
for char in A[::-3]:
print('\t'*3,char)
其效果如下:
也就是說,stop為負表示從左到右,從頭開始,到stop位置停止,不包括stop;start為負表示從左到右,從start開始,到末尾停止;step為負表示從右到左,按step跳過元素。
即,staart和stop的正負不影響讀取順序,step的正負才影響讀取順序。
另外。print(),表示空一行,'/t'表示制表符,可以用*2,*3表示多個,很方便。
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
