日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python語(yǔ)言學(xué)習(xí)(四)(字典和集合)

系統(tǒng) 1776 0

字典

  • 字典可以存儲(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ì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 儋州市| 蒙自县| 北安市| 荣昌县| 金溪县| 保靖县| 剑川县| 马边| 比如县| 洛隆县| 肇庆市| 镇巴县| 驻马店市| 义乌市| 克山县| 龙胜| 河北区| 博罗县| 绥江县| 海阳市| 科技| 南城县| 灌阳县| 宜兰县| 黄浦区| 苍梧县| 汨罗市| 施甸县| 嘉黎县| 清水河县| 郯城县| 阳江市| 布拖县| 淮安市| 临邑县| 图片| 澄江县| 玉溪市| 黑河市| 南通市| 南部县|