2 集合
本章涵蓋的主題有:
- 建立簡單的字典
- 從檔案載入以及儲存到檔案中;
- 集合操作
可以建立字串的索引,使索引更具有意義。
在字典中,次序是無關緊要的,通過鍵-值對來匹配。
dictionary =通過索引新增即可。
grade_dict={}
grade_dict['myself']=5
grade_dict['***']='7'
grade_dict['***']='9'
print(grade_dict)
#輸出:
#字典更好的輸出方式在稍後介紹
直接通過鍵訪問即可。
grade_dict['myself']
#輸出:5(接上程式)
這樣列印字典的內容時,指定的每個鍵(類似索引)都必須是存在的,否則會引發keyerror異常。
2. 如果要列印字典的全部內容,卻又不知道包含哪些鍵,那麼可以使用for語句:
for key in grade_dict:
print(key,'\t',grade_dict[key])
#輸出如下:
#myself 5
#*** 9
字典無法列印或者引用不存在的鍵對應的值。因此,有時在訪問時需要確定該鍵在字典中。
對於此問題,可以有多種解決方式:
使用try和except來處理引發的異常。
如果包含的鍵包含在字典中則返回true,否則返回false
使用方法get,其語法如下dictionary.get(key,default_val)
如果找到指定的鍵,那麼返回對應的值,否則返回指定值(即default_val,且預設為none*).
使用get方法的效率更好,因為只執行一次查詢。
示例程式如下:
grade_dict=
k='bill sky'
v=grade_dict.get(k)
if v:#如果不是none
print(k,"has the grade",v)
else:
print(k,'not in the database')
#使用items方法即可:
#示例:
phone_dict=
phone_list=phone_dict.items()
for i in phone_list:
print(i)
#輸出:
#('dty', 2446828)
#('cc', 1234)
#('wgl', 7585)
ps:也可以這樣訪問列表的值,因為列表內包含的是一系列包含(key,value)的元組
string.startswith(prefix_str)
**簿根據聯絡人的字首來找到聯絡人和號碼
phone_dict=
def display_by_prefix():
while true:
s=input('enter prefix (enter to exit)')
s=s.strip()
if not s:
return
for key in phone_dict:
if(key.startswith(s)):
print(key,phone_dict[key])
display_by_prefix()
#shuchu :enter prefix (enter to exit)d
#dty 2446828
練習:(基於上面的函式)
將輸出結果排序:
phone_dict=
def display_by_prefix():
while true:
s=input('enter prefix (enter to exit)')
s=s.strip()
if not s:
return
right_list=
for key in phone_dict #關鍵**!
if(key.startswith(s)):
right_list.sort()#關鍵**截止
for i in right_list:
print(i,phone_dict[i])
display_by_prefix()
將輸出的結果儲存在列表中,處理後再輸出即可
使用列表推導技術
right_list= [key for key in phone_dict if key.startswith(s)]
編寫乙個根據子串選擇元素的函式,它列印所有這樣的元素,即其鍵包含使用者輸入的子串。
phone_dict=
def display_by_prefix():
while true:
s=input('enter prefix (enter to exit)')
s=s.strip()
if not s:
return
#right_list= [key for key in phone_dict for i in key if i.startswith(s)]
right_list=
for key in phone_dict:
for i in range(len(key)):
if key[i::].startswith(s):
break
right_list.sort()
for i in right_list:
print(i,phone_dict[i])
display_by_prefix()
phone_dict=
def display_by_prefix():
while true:
s=input('enter prefix (enter to exit)')
s=s.strip()
if not s:
return
right_list=[key for key in phone_dict for i in range(len(key)) if key[i::].startswith(s)]
right_list.sort()
for i,item in enumerate(right_list,0):
if i>0 and right_list[i-1]==item :
print("",end='')
else:
print(item,phone_dict[item])
display_by_prefix()
輸出:enter prefix (enter to exit)c
ccm 1234
enter prefix (enter to exit)m
ccm 1234
dmaewe 12345
wgml 7585
enter prefix (enter to exit
在找出包含使用者輸入字元的字串時,會出現重複的情況,下文將重複的情況去掉:
for i,item in enumerate(right_list,0):
if i>0 and right_list[i-1]==item :
print("",end='')
else:
print(item,phone_dict[item])
集合的定義:
主要函式
add新增元素
remove刪除元素
示例利用集合來改進第六章的埃拉託色尼篩選法的示例
nums=set(range(2,20))
#20以內所有的數字(除了1)
comps=
#(20以內的合數,這裡求合數的思路挺不錯的)
primes=nums-comps
#(兩集合的差集,總數-合數=質數)
print(primes)
另附第六章的原始碼如下:
n=20
#列印2-20內的所有質數
com_list=[j for i in range(2.n) for j in range(i*i ,n, i)]
prime_list=[ i for i in range (2,n) if i not in comp_list]
print(prime_list)
第十二章 檔案
文字檔案 文字檔案是一種由若干字元構成的檔案,可以用文字編輯器進行閱讀或編輯。以txt py html等為字尾的檔案都是文字檔案。2.二進位制檔案 二進位制檔案一般是指不能用文字編輯器閱讀或編輯的檔案。以 mp4 png等為字尾的檔案都是二進位制檔案,如果想要開啟或修改這些檔案,必須通過特定軟體進行...
第十二章 dp
動態規劃策略 將原始問題拆分為多個子問題,將子問題結果記錄,方便復用子問題的解 遞迴 記憶化 遞推 是動態規劃的一體兩面,本質都是一樣的 遞推減少了呼叫次數,空間上還能優化,一般選擇遞推方式 遞迴 記憶化 int memo maxn 將o 2 n o n intfibonacci int n 遞推 ...
第十二章 異常
一 異常的概念 錯誤 編譯器 異常 執行期,程式沒有正常按照期望執行 異常產生時,在對應位置產生異常型別物件,程式 暫停 如果上下文有異常處理程式,對應處理 沒有則 異常向上傳播 報錯退出 異常向上傳播 如果異常在函式中產生,會傳播給函式的呼叫者 如果異常在模組的頂級位置,會傳播給引用該模組的模組 ...