Python內置數據結構
分類
- 數值型
- int、float、complex、bool
- 序列對象
- 字符串 str
- 列表 list
- 元組 tuple
- 鍵值對
- 集 set
- 字典 dict
數值型
- 數值型
- int、float、complex、bool都是類(class),1、5.0、1+2j都是對象即實例
- int:在python3版本中表示長整型,沒有大小限制,受限制于內存區域大小
- float:浮點數由整數部分和小數部分組成,支持十進制和科學計數法表示,在python中只有雙精度浮點數
- complex:復數由實數和虛數部分組成,實數和虛數都是浮點數,例:3+4.2j
- bool:int的子類,基友兩個實例True和False,分別代表1和0,可以直接和整數計算
- 類型轉換
- int(x) #返回一個整數
- float(x) #返回一個浮點數
- complex(x)/comples(x,y) #返回一個復數
- bool(x) #返回布爾值,對應關系可查看真值表
- 數字的處理函數
- python中管與數學處理的模塊math需要單獨導入(import math),math.floor表示舍去小數部分的值取整,math.ceil表示只要小數位不是零則一律進1
- int() #將括號內的浮點數小數點后的數值舍掉,只取整數部分
- round() #這個函數去正式遵循四舍六入,當小數點后為5時,取離得最近的偶數值
可以測試下如下代碼: - print(math.ceil(2.1)) - print(math.floor(2.9)) - round(2.5) - round(3.5) - round(3.4) - round(3.6) - min() #取括號內數字的最小值 - max() #取括號內數字的最打值 - pow(x,y) #取x的y次方 - math.sqrt(9) #取就得0.5次方,也就是√-3 - math.pi #取π的值3.141592653589793 - math.e #取自然常數的值2.718281828459045
- 轉換進制
- bin() #轉換為二進制字符串
- oct() #轉換位八進制字符串
- hex() #轉換為十六進制字符串
- 類型判斷
- type(object),返回類型,而不是字符串 例:type(a)、type(‘b’)、type(123) type(1+True+3.0)返回的類型是浮點型,這是應為因為在數學計算中包含一個隱式轉換,由精度低的數項精度高的數轉換
- isinstance(obj,class_or_tuple),判斷參數是不是后面其中一個的類型,返回布爾值 例:isinstance(6,str) isinstance(6,(str,bool,int,float))
列表(list)
- 列表的特性
- 一個隊列,排列整齊的隊伍
- 列表里的個體稱為元素(item),有若干元素組成
- 元素可以式任意的數字、字符串、對象、列表等
- 列表內元素有順序,可以使用索引
- 屬于線性數據結構
- 使用[]表示,[]空的中括號表示空列表
- 列表是可以變化的,可以增、刪、改、查和追加
- 列表list、鏈表(linklist)、隊列(queue)、棧(stack)的差異
- 列表是有序地,一個接一個排列的集合,每一個元素占據一個單位,就像書本一樣,一頁內容對應一個頁碼,可以通過索引來查找
- 鏈表是有連接的,一個連一個的,好比手拉手,通過前一個元素可以找到下一個元素
- 隊列可以是列表,也可以是鏈表,他可以項放行一樣先進先出,也可以像解散一樣后進先出
- 棧 是以類似重疊的方式排列,就像摞盤子一樣是典型的后進先出隊列
- 列表list定義、初始化
- list() -> new empty list
- list(iterable) -> new list initialized from iterable’s items(從可迭代的元素初始化列表)
- 列表不能一開始就定義大小這是Python中的列表特性,它是可變化的
- 列表的元素也可以是函數的結果
- 列表索引訪問
- 索引(index),也叫下標
- 正索引:從左到右,從0開始,是列表中每一個元素的編號
- 負索引:從右到左,從-1開始
- 正負索引不能超超界,超界后報錯IndexError
- 默認認為列表是從左往右排列的,左邊頭部右邊尾部,左邊下界右邊上界
- 列表可以通過索引來訪問,格式為listname[index],index就是索引,是指某個元素在列表中的位置,默認從0開始
In [4]: lst Out[4]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] In [5]: In [5]: lst[6] Out[5]: 6 In [6]:
- 列表查詢
- index(valiue,[start,[stop]]) 1.通過值value,從指定區間查找列表的元素是否匹配 2.匹配第一個值就返回索引 3.匹配不到,顯示valueError
- count(value) 返回列表中匹配到的值得次數
- 時間復雜度 1.index和count的方法復雜度是O(n),O(1)這個是表示效率最高,一步操作;count的時間復雜度是O(n)表示所有元素查看一遍或者叫遍歷,有n個元素就做n次操作 2.隨著數據規模的增大,效率會越來越低
- 函數len() 查詢項目中元素的個數,是公共的內建函數,可以查詢類似集合的元素數量
- 查詢幫助
- 查看幫助文檔
- 查看官方文檔
- 在ipython中通過help(keyword)
- keyword可以是函數、類、對象、變量、方法名
- 列表元素修改 當操作修改列表完成時若返回none值則沒有新列表生成,是為就地修改
- 索引訪問修改 list[index]=value,索引不能超界,否則就提示異常 -列表增加,插入元素
1. append(object) #尾部追加,不會生成新的列表,時間復雜度O(1) 2. insert(index,object) #在指定索引處插入一個值,索引開始到最后的元素整體后移一個單位,索引超下界會在頭部追加,超上界尾部追加。由于操作會硬氣內存結構的變化,所以一般不使用 3. extend(iteratable) #列表擴展:將可迭代對象的元素追加進來,就地修改 4. list1+list2 #連接操作,將兩個列表連接起來,產生新表,原列表不變 5. list*num #重復操作,將本列表元素重復n次,返回新的列表
- 列表刪除元素
1. remove(value) #從左往右查找第一個匹配的值并移除,就地修改 2. pop([index]) #不指定索引,從列表哦尾部彈出一個元素,或者制定索引,從指定索引出彈出元素 3. clear() #清楚對象列表中的所有元素,剩下一個空列表
- 列表其他操作
1.reversed() #將列表中元素顛倒順序,就地修改 2.sort(key=None,reverse=False) #對列表驚醒排序,就地修改,默認升序;reverse=True,就是反轉并按降序排列;key可以制定一個函數,指定key如何排序 3. in 查看一個元素在不在一個列表中;而for x in [1,2,3,4]表示從列表中取出元素附給x
- 索引訪問修改 list[index]=value,索引不能超界,否則就提示異常 -列表增加,插入元素
- 列表復制
- copy() #shadown cpoy(影子復制),也叫淺拷貝,遇到引用類型,只是復制了一個引用,如果引用的對象被修改,則兩個列表所引用的元素都會改變,
- 深拷貝,copy模塊提供深拷貝,深copy會在內存中新建一個列表,并賦值
隨機數
random模塊 1.random.randint(a,b) #返回[a,b]之間的整數 2.random.choice(seq) #從非空序列中隨機挑選一個元素 3.randrange([start,]stop[,step]) #從指定按制定奇數遞增的集合中獲取一個隨機數,默認奇數為1 4.random.shuffle(list) #就地打亂列表元素
練習
1.求100內的素數
lst=[2]
for i in range(3,100,2):
for n in lst:
if i%n ==0:
break
else:
#print(i)
lst.append(i) #將計算出的素數追加到素數列表中
print(lst)
import math
pn=[]
for x in range(3,1000,2):
for i in pn:
if x%i==0:
sign=True
break
if i>=math.ceil(x**0.5):
sign=False
break
if not sign: #只有是真值的時候,才會執行及里邊的語句塊,當flag為False,not flag是True,程序才會進去if內部語句塊,否則就繼續下面的語句
#print(x)
pn.append(x)
print(pn)
2.計算楊輝三角的前六行
triangle=[[1],[1,1]]
for i in range(2,6):
p = triangle[i-1]
cur=[1]
for j in range(0,i-1):
cur.append(p[j]+p[j+1])
cur.append(1)
triangle.append(cur)
print(triangle)
triangle=[]
for i in range(6):
if i==0:
lr=[1]
triangle.append(lr)
else:
p=triangle[i-1]
cur=[1]
for j in range(0,i-1):
cur.append(p[j]+p[j+1])
cur.append(1)
triangle.append(cur)
print(triangle)
triangle=[]
for i in range(6):
if i==0:
lr=[1]
triangle.append(lr)
else:
p=[0]
p.extend(triangle[i-1])
p.append(0)
cur=[]
for j in range(0,i+1):
cur.append(p[j]+p[j+1])
triangle.append(cur)
print(triangle)
triangle=[]
for i in range(6):
if i==0:
lr=[1]
triangle.append(lr)
elif i==1:
lr=[1,1]
triangle.append(lr)
else:
p=triangle[i-1]
cur=[1]
x=1
while x<=(i-1):
cur.append(p[x-1]+p[x])
x+=1
cur.append(1)
triangle.append(cur)
print(triangle)
方法二
ol=[]
nl=[1]
print(nl)
for i in range(1,6):
ol=nl.copy()
ol.append(0)
nl.clear()
offset=0
while offset<=i:
nl.append(ol[offset-1]+ol[offset])
offset+=1
print(nl)
元組(tuple)
元組是一個有序的元素組成的集合,使用()表示,元組是不可變對象,包括元祖的的長度和元素本身。如果元祖中的元素是一個引用對象,當引用對象本身發生變化是,元組中的元素才會發生變化。
- 定義
- tuplename=tuple() #定義一個空元組,括號里可以是可迭代對象、數字、字符串、列表等
- tuplename=tuple(2,) #當定義一個元素的元組時,要在元素后加個逗號,否則會提示括號所在的類不是一個可迭代對象
- tuple和list一樣,可以使用‘+’連接兩個不同的元組,創建一個新的元組打印出來,也可以通過‘*’創建一個被乘的元組重復幾次的新元組打印出來。
- 元祖也支持索引訪問,包括正負索引,其訪問的方式和列表一樣,但是索引不能超界,否則引發異常
- tuplename.index(9) #在tuplename這個元組中查看9的索引,會返回從左到右最近的匹配到的9的索引,匹配不到就返會valueerror。
- tuplename.count(9) #在tuplename這個猿族中查詢9這個值在元組中出現了幾次
- len(tuplename) #查詢元祖的長度或者說是元組中元素的個數
- 元組類似于只讀權限的文件,這可以讀取,不能增改刪,只能刪除整個元組
- 命名元組namedtuple
- namedtuple使用時需要執行命令“from collections import namedtuple”
- namedtuple(typename,field_names(可以是空格或者逗號分隔的字段的字符串,也可以是字段的列表),verbose=FaLse,rename=False) #命名元組,返回元組的子類,并定義字段 例: “` In [2]: from collections import namedtuple
In [3]: Point=namedtuple('_Point',['x','y']) In [4]: p=Point(11,22) In [5]: p.x Out[5]: 11 In [6]: p.y Out[6]: 22 ```
- 練習
- 以此接收用戶輸入的3個數,排序后打印
- 轉換int后,判斷大小排序
- 使用max函數
- 使用列表的sort方法
- 冒泡法
- 以此接收用戶輸入的3個數,排序后打印
字符串
字符串是有序的字符集合或者稱字符序列,支持使用索引訪問,是一個可迭代的對象
- 字符串join連接 python種特殊字符需要轉義后使用
例: In [15]: lst Out[15]: ['1', '2', '3'] In [16]: print('/'.join(lst)) 1/2/3 In [17]: print('\\'.join(lst)) 1\2\3 In [18]: print('"'.join(lst)) 1"2"3
-
- 連接符 和列表的用法一樣,在這里是將兩個字符串連接到一起返回一個新字符串
- 字符串分割 1.split系:將字符分割成若干字符串,并返回列表。
格式 - (string's name).split(sep=None,maxsplit=-1) 分割時時從左向右sep制定分割字符串,默認時空白字符串作為分隔符;maxsplit制定分割次數,-1表示便利整個字符串。 - (string's name).rsplit(sep=None,maxsplit=-1) 從右向左 - (string's name).splitlines([keepends]) 按照行來切分字符串,keepends指的是是否保留行分隔符(\n、\r\n、\r等)
2.partittion系:將字符串按照分隔符分成兩段,放回這兩段和分割符的元組
- partition(sep(必須指定)) 從左到右,遇到分隔符就把字符串分成兩部分,返回頭(head)、分隔符、尾(tail)三部分的三元組;如果沒有找到分隔符,就返回頭、2個空元素的三元組 - rpartition(sep) 從右到左,功能同上
- 字符串大小寫
- upper() 全大寫
- lower() 全小寫
- swapcase() 交互大小寫,就是大寫變小寫,小寫變大寫。
- 字符串排版
- title 標題的每個單詞首字母大寫
- capitalize 第一個單詞首字母大寫
- center(width[,fillchar]) 打印字符串時居中打印,用多少個字符的寬度如果字符串不夠用某個字符填充,默認字符是空格
- zfill(width) 右對齊打印,左邊字符不夠的用0填充
- ljust/rjust(width[,fillchar]) 左/右對齊打印
- 字符串修改
- replace(old,new[,count]) 替換 在字符串中找到指定字符串,替換為新字符串,返回新字符串,count表示替換幾次 - strip([chars]) 去除 從字符串兩端去除指定字符集chars中的所有字符串,如果chars沒有指定則去除空白字符,同樣有兩種變體:lstrip/rstrip 從左/右開始去除 - find(sub[,start[,end]]) 查找字符串 在指定區間從左到右查找子串sub,找到則返回索引,沒有就返回-1 變體rfind:從右到左查找 - index(sub[,start[,end]]) 查找字符串 在指定區間從左到右查找子串sub,找到則返回索引,沒有就返回ValueError 變體rindex:從右到左查找 - count(sub[,start[,end]]) 統計 在指定區間從左到右統計子串sub出現的次數 - endwith/startwith([char,start[,end]]) 字符串判斷 在指定的區間中,字符串是否以指定的字符串開頭或者結尾,返回bool值 - ismetacharacters() 判斷字符串有那些字符組成 metacharacters可以時alpha、num、decimal、digit、dentifier、lower、upper、space等
- 字符串格式化 字符串格式化是指將字符串以特定的輸出樣式輸出的書法
- join連接只能使用分隔符,但是連接的對象必須是可迭代對象
- ’+‘連接字符串比較方便,但是只能連接字符串
- printf style
在python2.5版本之前只能使用printf style(C語言風格)的方式來格式化 格式要求 占位符,使用%和格式字符組成 1.s掉用str()表示字符串;r調用repr(),表示對象通過repr函數轉換為字符串;d調用int(),表示數字 2. 占位符中汗可以插入修飾字符,例如%03d表示打印的字符站三個字符的位置,不夠的前面用0補齊
- python自用的格式化字符串的語法
'{}{xxx}'.format(*args,*kwargs) 1. args是位置參數,是個元組 2. kwargs是關鍵字參數,是個字典 3. 大括號表示占位符 4. {}表示按照順序匹配位置參數,{n}表示取位置參數索引n的值 5. {{}}表示打印大括號 6. {xxx}表示在關鍵字仲搜索名稱一致的 7. {lst[0]}表示訪問對象元素 8. {p.x}表示對象屬性訪問 例: '{}:{}'.format('192.168.1.100',8888) 按位置參數匹配 '{server}{1}:{0}'.format(8888,'192.168.1.100',server='Webserver') 匹配關鍵字參數或命名參數 對齊 '{0}*{1}={2:<2}'.format(3,2,3*2) '{0}*{1}={2:<02}'.format(3,2,3*2) '{0}*{1}={2:>02}'.format(3,2,3*2) '{:^30}'.format('Internet Data Center') 表示占用30個字符居中對齊,不夠的用空白字符填充 '{=:^30}'.format('Internet Data Center') 表示占用30個字符居中對齊,不夠的用=字符填充 進制轉換 '{0:d/x/o/b/X}'.format(99) d表示十進制,x/X表示十六進制小/大寫,o表示八進制,b表示二進制
練習
- 用戶輸入一個數字
- 判斷是幾位數
- 打印每一位數重復次數
- 按照個十百千萬順序打印每一位上的數字
num=''
while True:
num=input('Enter:').strip()
if num.isdigit():
break
else:
print('please Enter number')
count=[0]*10
for i in range(10):
count[i]=num.count(str(i))
for i in range(10):
if count[i]:
print(i,count[i])
lst=list(num)
lst.reverse()
print(lst)
- 輸入五個數字,打印每個數字的位數,將這些數字按升序排列打印
列表排序
n=''
lst=[]
wsl=[]
c=0
while c<=4:
n=input('Enter:')
lst.append(int(n))
wsl.append(len(n))
c+=1
print(wsl)
lst.sort()
print(lst)
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87482