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}