Python入門——基本數據結構

Python里面的數據結構,基本的有下面幾種,列表,集合,元組,對于不同的數據結構當然有不同的表現形式,操作方法了,先來看看各種數據結構的表示方式

#列表
[1,2,3,4,5,6]
#元組
(1,2,3,4,5,6)
#集合
{1,2,3,4,5,6}
#字典
{'name': 'tom', 'age': 11}

列表

列表的特點是,它是一個可變的集合,不僅僅是結構可變,里面還可以放類型不一樣的對象,比如

num = [1,2,3,4,"23",True]
for x in num:
    print(type(x))
#輸出結果為
<class 'int'>
<class 'int'>
<class 'int'>
<class 'int'>
<class 'str'>
<class 'bool'>

可以看到同一個集合中可以加入各種類型的數據,不會有類型檢測。所以我們在使用的時候在代碼的編寫上也要注意了。

對列表的常規操作有
獲取元素
如果只是單純地訪問元素,我們可以使用切片或者下標num[0...n],不過列表有一個

num = [1,2,3,4,"23",True]
print(num[3])
#輸出結果為3
print(num[3:5])
#輸出結果為[4, '23']

添加元素

num = [1,2,3,4,"23",True]
#方法1,append方法插入,常用,只能添加一個元素
num.append(3)
#方法2,獲取切換的最后一個位置,在這里就是num[6:6]的意思
num[len(num):] = [3]
print(num)
#輸出結果為[1, 2, 3, 4, '23', True, 3]

添加一個集合

#添加一個集合,extend擴展的意思
num = [1,2,3,4,"23",True]
1、方法1,extend方法插入,添加一個集合
num.extend([8,5])
2、方法2,切片方法,同上
num[len(num):] = [8,5]
print(num)
#輸出結果為[1, 2, 3, 4, '23', True, 3,8,5]

插入元素到指定位置

num = [1,2,3,4,"23",True]
#方法1,insert插入讓3成為集合里面下標為1的元素,其他元素往后挪
num.insert(1,3)
#方法2,使用切片
num[1:1] = [3]
print(num)
#輸出結果為[1, 3, 2, 3, 4, '23', True]

移除元素
刪除列表中值為 x 的第一個元素。如果沒有這樣的元素,就會返回一個錯誤。

num = [1,2,3,3,4,"23",True]
num.remove(3)
print(num)
#輸出結果為[1, 3, 2, 3, 4, '23', True],只會移除最先匹配到的元素

#如果移除的元素不存在,會拋出下列錯誤ValueError: list.remove(x): x not in list

還有一些其它的函數

#列表采用的鏈式結構,pop默認把序列尾部的元素remove并返回,pop(x)代表的是pop指定下標的元素
pop()
pop(x) 
#對列表中的元素就地進行排序
sort() 
#對列表的元素進行倒排
reverse()
#返回一個列表的副本,可以通過切片[:]來實現
copy()
#計算列表中某個元素x的個數
count(x)
#獲取列表中第一個匹配到的元素x的下標,如果沒有匹配到的話返回一個錯誤ValueError: x is not in list
index(x)
#清空列表的元素,和del num[:]的效果是一樣的
clear()

字符串也是列表,所以我們適用于字符串的操作,基本上都適合列表,比如下面的用法

num = [1,2,3]
print(num * 3)
#輸出結果為[1, 2, 3, 1, 2, 3, 1, 2, 3]

所以列表的操作也變得和字符串一樣簡單了,但是我們最好還是規范一下代碼,這樣利用代碼的閱讀。

元組

元組(tuple)也是一個非常常用的數據結構,區別于列表,元組的一個最大的特性就是不可變。一個元組由數個逗號分隔的值組成,比如:

t = 1,2,3,4,5,'sad',True
print(t)
#輸出結果為(1, 2, 3, 4, 5, 'sad', True)

雖然我們定義元組的時候可以不加括號,但是加上括號可以更加適合代碼的閱讀。
元組可以進行嵌套,類似于廣義表一樣

a = (1,2,3)
b = (4,5,6)
print((a,b))#必須添加一個括號,否則,print函數會把`,`號轉換成空格

不可變
元組是不可變的,這種不可變體現在元素的引用上,比如

num = [1,2,3]
a = (1,2,3,num)
# 對元組元素進行修改會拋出異常TypeError: 'tuple' object does not support item assignment
a[0] = 3
print(a)

num = [1,2,3]
a = (1,2,3,num)
print(a)
#輸出結果為(1, 2, 3, [1, 2, 3])
num[0] = 3
print(a)
#輸出結果為(1, 2, 3, [3, 2, 3])

可以看到元組雖然是可不變的,但是對于元組里面的list列表是可變的,我們對list進行操作并不會報錯。這是因為我們雖然修改了列表,但是元組里面的列表對象指向的內存地址依然是不變的。
當我們想要構建空的元組或者構建只有一個元素的元組

#定義空元組
a= ()
#定義只有一個元素的元組,一定要加上,號,否則無法區分是元組還是單個的對象
b = (1,)
print(a)
print(b)
#輸出結果為
()
(1,)

python的語法非常的神秘莫測,不同于其他編程語言,能夠直接取出線性序列中的元素

a= (1,2,3)
t1,t2,t3 = a
print(a)
print(t1,t2,t3)
#輸出結果為
(1, 2, 3)
1 2 3

集合

另一種比較常見的數據結構是集合(set),和java一樣,集合是一個無序不重復元素的集,基本功能包括關系測試和去重(是否包含子集,交集,并集等)
通常我們用大括號或者set()函數來創建集合,使用set()來創建空集合

num = {1,2,3,4,5,6,6}
print(num)
#輸出結果為{1, 2, 3, 4, 5, 6}

#檢測是否包含元素
print(1 in num)
#輸出結果為True

num = {1,2,3,4,5,6,6}
num2 = {0,1,2,3,7,8,9}

#差集,集合A中有,集合B中沒有的元素
num3 = num - num2
print(num3)
#輸出結果為{4, 5, 6}

#交集,兩個集合都包含的元素
num3 = num & num2
print(num3)
#輸出結果為{1, 2, 3}

#并集,融合兩個集合,去除重復的部分
num3 = num | num2
print(num3)
#輸出結果為{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

#異或,存在于集合A或者集合B,但不同時存在于兩個集合中
num3 = num - num2
print(num3)
#輸出結果為{0, 4, 5, 6, 7, 8, 9}

有一種集合推導式語法:

num= [x for x in list(range(20)) if x % 2 != 0]
print(num)
#輸出結果為{1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
num= {x for x in "ababababababbae" if x not in "abc"}
print(num)
#輸出結果為{'e'}

字典

字典相當于java中的map,字典以key作為索引,關鍵字key可以是任意不可變類型,如果會比的話,就無法求得相同的索引了,通常用字符串或數值。如果元組中只是包含字符串或者數字的話,元組也是可以作為關鍵字使用的,但是如果元組中包含像列表這樣的可變對象,那么就不能夠作為關鍵字了。

字典是一個無序的鍵值對組合,使用{}來創建空的字典。基本上在java中對map的操作都適用于python里面的字典,比如對key相同的鍵值對進行寫入的話,會覆蓋原來的value,不過要是訪問不存在的key,在java里面會返回null,而且python中會返回None,但是python中還可以設置默認的值

person= {'name': 'tom', 'age': 11}
grade = person.get('grade')
print(grade)
#輸出結果為None

person= {'name': 'tom', 'age': 11}
grade = person.get('grade','grade first')
print(grade)
#輸出結果為grade first

對一個字典執行 list(d.keys())將返回一個字典中所有關鍵字組成的無序列表(如果你想要排序,只需使用 sorted(d.keys())使用 in 關鍵字可以檢查字典中是否存在某個關鍵字(指字典),使用del可以刪除key關鍵字,或者刪除整個字典,刪除之后如果再訪問字典,就會拋出NameError: name 'person' is not defined對象未定義的異常
構造字典可以使用{},也可以使用dict()構造函數

person = dict([('name','tom'), ('age',11)])
print(person)
#輸出結果為{'name': 'tom', 'age': 11}

person = dict(name='tom',age=11)
print(person)
#輸出結果為{'name': 'tom', 'age': 11}

也可以使用字典推導式創建字典

num = {x:x**2 for x in range(5)}
print(num)
#輸出結果為{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容