字典
- 字典可以存儲(chǔ)任意類(lèi)型對(duì)象,與列表、集合不同的是,字典的每個(gè)元素都是由一個(gè)鍵和一個(gè)值組成的“鍵值對(duì)”,鍵和值通過(guò)冒號(hào)分開(kāi)。下面的代碼演示了如何定義和使用字典。
def main():
scores = {'駱昊': 95, '白元芳': 78, '狄仁杰': 82}
# 通過(guò)鍵可以獲取字典中對(duì)應(yīng)的值
print(scores['駱昊'])
print(scores['狄仁杰'])
# 對(duì)字典進(jìn)行遍歷(遍歷的其實(shí)是鍵再通過(guò)鍵取對(duì)應(yīng)的值)
for elem in scores:
print('%s\t--->\t%d' % (elem, scores[elem]))
# 更新字典中的元素
scores['白元芳'] = 65
scores['諸葛王朗'] = 71
scores.update(冷面=67, 方啟鶴=85)
print(scores)
if '武則天' in scores:
print(scores['武則天'])
print(scores.get('武則天'))
# get方法也是通過(guò)鍵獲取對(duì)應(yīng)的值但是可以設(shè)置默認(rèn)值
print(scores.get('武則天', 60))
# 刪除字典中的元素
print(scores.popitem())
print(scores.popitem())
print(scores.pop('駱昊', 100))
# 清空字典
scores.clear()
print(scores)
if __name__ == '__main__':
main()
-
字典在不同語(yǔ)言中都有所提及,只是叫法不同,在c語(yǔ)言中即map,java中即HashTable or HashMap。
-
創(chuàng)建字典
使用"{}“創(chuàng)建字典,使用”:“指明“鍵:值”對(duì),各對(duì)之間用”,"分隔開(kāi)。
鍵必須是不可變的且不重復(fù),值可以是任意類(lèi)型。 -
訪問(wèn)字典
使用"[]"運(yùn)算符,鍵作為索引,即相當(dāng)于列表中的下標(biāo),在字典中,鍵值對(duì)是無(wú)序的,與插入先后并無(wú)關(guān)系。 -
字典支持的運(yùn)算符和方法
len(my_dict)可以得到字典中鍵-值對(duì)的數(shù)量;
key in my_dict可以快速判斷key是否為字典中的鍵,時(shí)間復(fù)雜度為O(1),in即等價(jià)于my_dict.has_key(key);
for key in my_dict可以枚舉字典中的鍵,其中鍵是無(wú)序的;
此外,還有.items()返回全部鍵-值對(duì),.keys()返回全部鍵,.values()返回全部值,.clear()清空字典等方法。 -
練習(xí):讀取一個(gè)字符串,計(jì)算每個(gè)字母出現(xiàn)的次數(shù)。
方法一:可以生成具有26個(gè)元素的列表,將每個(gè)字母轉(zhuǎn)化為相應(yīng)的索引值,每出現(xiàn)一次,將索引值對(duì)應(yīng)的元素加1,代碼如下。
s = 'asdqwfvsdbeg'
lst = [0] * 26
for i in s:
lst[ord(i) - 97] += 1
print(lst)
方法二:生成一個(gè)字典,字母作為鍵,對(duì)應(yīng)出現(xiàn)的次數(shù)作為值,代碼如下。
s = 'sasfqgdsherhet'
d = {}
for i in s:
if i in d:
d[i] += 1
else:
d[i] = 1
print(d)
- 練習(xí):讀取小說(shuō)“emma.txt”,打印前10個(gè)最常見(jiàn)單詞,仍使用字典解決,代碼如下。
f = open('emma.txt')
word_freq = {}
for line in f:
words = line.strip().split() # 將一行的文本根據(jù)空格切分成若干單詞
for word in words:
if word in word_freq:
word_freq[word] += 1
else:
word_freq[word] = 1
freq_word = []
for word, freq in word_freq.items():
freq_word.append((freq, word))
freq_word.sort(reverse=True)
for freq, word in freq_word[:10]:
print(word)
f.close()
-
練習(xí):翻轉(zhuǎn)字典,生成一個(gè)新字典,鍵為原字典的值,值為原字典的鍵。
同一個(gè)值,可能對(duì)應(yīng)多個(gè)鍵,需要用列表存儲(chǔ),代碼如下。
d1 = {'zhang': 123, 'wang': 456, 'li': 123, 'zhao': 456}
d2 = {}
for name, room in d1.items():
if room in d2:
d2[room].append(name)
else:
d2[room] = [name]
print(d2)
集合
- Python中的集合跟數(shù)學(xué)上的集合是一致的,不允許有重復(fù)元素,而且可以進(jìn)行交集、并集、差集等運(yùn)算,下面是基本代碼。
def main():
set1 = {1, 2, 3, 3, 3, 2}
print(set1)
print('Length =', len(set1))
set2 = set(range(1, 10))
print(set2)
set1.add(4)
set1.add(5)
set2.update([11, 12])
print(set1)
print(set2)
set2.discard(5)
# remove的元素如果不存在會(huì)引發(fā)KeyError
if 4 in set2:
set2.remove(4)
print(set2)
# 遍歷集合容器
for elem in set2:
print(elem ** 2, end=' ')
print()
# 將元組轉(zhuǎn)換成集合
set3 = set((1, 2, 3, 3, 2, 1))
print(set3.pop())
print(set3)
# 集合的交集、并集、差集、對(duì)稱(chēng)差運(yùn)算
print(set1 & set2)
# print(set1.intersection(set2))
print(set1 | set2)
# print(set1.union(set2))
print(set1 - set2)
# print(set1.difference(set2))
print(set1 ^ set2)
# print(set1.symmetric_difference(set2))
# 判斷子集和超集
print(set2 <= set1)
# print(set2.issubset(set1))
print(set3 <= set1)
# print(set3.issubset(set1))
print(set1 >= set2)
# print(set1.issuperset(set2))
print(set1 >= set3)
# print(set1.issuperset(set3))
if __name__ == '__main__':
main()
-
Python中允許通過(guò)一些特殊的方法來(lái)為某種類(lèi)型或數(shù)據(jù)結(jié)構(gòu)自定義運(yùn)算符,上面的代碼中我們對(duì)集合進(jìn)行運(yùn)算的時(shí)候可以調(diào)用集合對(duì)象的方法,也可以直接使用對(duì)應(yīng)的運(yùn)算符,例如&運(yùn)算符跟intersection方法的作用就是一樣的,但是使用運(yùn)算符讓代碼更加直觀。
-
集合即無(wú)序不重復(fù)元素(鍵)集,和字典類(lèi)似,但無(wú)“值”。
-
使用set()函數(shù)創(chuàng)建集合,或使用{key1,key2,…}的方式。使用.add(‘body’)添加元素,.remove(‘body’)刪除元素。
-
集合運(yùn)算符:“-”求差集,”&“求交集,”|“求并集,”!=“為不等于,”==“為等于,”in“為成員,”for … in“為枚舉。
-
練習(xí):中文分詞,如“我愛(ài)北京天安門(mén)”,分為“我/愛(ài)/北京/天安門(mén)”。
使用正向最大匹配算法,從左到右取盡可能長(zhǎng)的詞,但可能會(huì)出現(xiàn)邏輯錯(cuò)誤。
前提需要有詞典收錄中文詞匯,如命名詞典為“l(fā)excion.txt”,先對(duì)詞典進(jìn)行操作,在返回字典集合的同時(shí),還要返回詞典中最長(zhǎng)字段的長(zhǎng)度,代碼如下。
def load_dict(filename):
word_dict = set()
max_len = 1
f = open(filename)
for line in f:
word = str(line.strip()) # 在python2中有unicode函數(shù),是一種編碼標(biāo)準(zhǔn),在python3中改為了str函數(shù)
word_dict.add(word)
if len(word) > max_len:
max_len = len(word)
return max_len, word
接著實(shí)現(xiàn)正向最大匹配算法,按照最大長(zhǎng)度遞減進(jìn)行分詞,后續(xù)代碼如下。
def fmm_word_seg(sent, max_len, word_dict):
begin = 0
words = []
sent = str(sent)
while begin < len(sent):
for end in range(begin + max_len, begin, -1):
if sent[begin:end] in word_dict:
words.append(sent[begin:end])
break
begin = end
return words
max_len, word_dict = load_dict('lexicon.dic')
sent = input()
words = fmm_word_seg(sent, max_len, word_dict)
for word in words:
print(word)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
