第十二章 字典和集合

2021-09-24 07:06:33 字數 4632 閱讀 2568

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

字典無法列印或者引用不存在的鍵對應的值。因此,有時在訪問時需要確定該鍵在字典中。

對於此問題,可以有多種解決方式:

使用tryexcept來處理引發的異常。

如果包含的鍵包含在字典中則返回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 遞推 ...

第十二章 異常

一 異常的概念 錯誤 編譯器 異常 執行期,程式沒有正常按照期望執行 異常產生時,在對應位置產生異常型別物件,程式 暫停 如果上下文有異常處理程式,對應處理 沒有則 異常向上傳播 報錯退出 異常向上傳播 如果異常在函式中產生,會傳播給函式的呼叫者 如果異常在模組的頂級位置,會傳播給引用該模組的模組 ...