欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用Python中的字典來處理索引統(tǒng)計的方法

 更新時間:2015年05月05日 09:57:25   作者:xrzs  
這篇文章主要介紹了用Python中的字典來處理索引統(tǒng)計的方法,字典的使用是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,本文則是相關(guān)的一個小實踐,需要的朋友可以參考下

最近折騰索引引擎以及數(shù)據(jù)統(tǒng)計方面的工作比較多, 與 Python 字典頻繁打交道, 至此整理一份此方面 API 的用法與坑法備案.

    索引引擎的基本工作原理便是倒排索引, 即將一個文檔所包含的文字反過來映射至文檔; 這方面算法并沒有太多花樣可言, 為了增加效率, 索引數(shù)據(jù)盡可往內(nèi)存里面搬, 此法可效王獻(xiàn)之習(xí)書法之勢, 只要把十八臺機(jī)器內(nèi)存全部塞滿, 那么基本也就功成名就了. 而基本思路舉個簡單例子, 現(xiàn)在有以下文檔 (分詞已經(jīng)完成) 以及其包含的關(guān)鍵詞

  doc_a: [word_w, word_x, word_y]
  doc_b: [word_x, word_z]
  doc_c: [word_y]

將其變換為

  word_w -> [doc_a]
  word_x -> [doc_a, doc_b]
  word_y -> [doc_a, doc_c]
  word_z -> [doc_b]

    寫成 Python 代碼, 便是
 

doc_a = {'id': 'a', 'words': ['word_w', 'word_x', 'word_y']} 
doc_b = {'id': 'b', 'words': ['word_x', 'word_z']} 
doc_c = {'id': 'c', 'words': ['word_y']} 
 
docs = [doc_a, doc_b, doc_c] 
indices = dict() 
 
for doc in docs: 
  for word in doc['words']: 
    if word not in indices: 
      indices[word] = [] 
    indices[word].append(doc['id']) 
 
print indices

    不過這里有個小技巧, 就是對于判斷當(dāng)前詞是否已經(jīng)在索引字典里的分支
 

if word not in indices: 
  indices[word] = []

可以被  dict  的  setdefault(key, default=None)  接口替換. 此接口的作用是, 如果  key  在字典里, 那么好說, 拿出對應(yīng)的值來; 否則, 新建此  key , 且設(shè)置默認(rèn)對應(yīng)值為  default . 但從設(shè)計上來說, 我不明白為何  default  有個默認(rèn)值  None , 看起來并無多大意義, 如果確要使用此接口, 大體都會自帶默認(rèn)值吧, 如下
 

for doc in docs: 
  for word in doc['words']: 
    indices. setdefault(word, []) .append(doc['id'])

    這樣就省掉分支了, 代碼看起來少很多.
    不過在某些情況下,  setdefault  用起來并不順手: 當(dāng)  default  值構(gòu)造很復(fù)雜時, 或產(chǎn)生  default  值有副作用時, 以及一個之后會說到的情況; 前兩種情況一言以蔽之, 就是  setdefault  不適用于  default  需要惰性求值的場景. 換言之, 為了兼顧這種需求,  setdefault  可能會設(shè)計成
 

def setdefault(self, key, default_factory): 
  if key not in self: 
    self[key] = default_factory() 
  return self[key]

倘若真如此, 那么上面的代碼應(yīng)改成
 

for doc in docs: 
  for word in doc['words']: 
    indices.setdefault(word, list ).append(doc['id'])

不過實際上有其它替代方案, 這個最后會提到.

    如果說上面只是一個能預(yù)見但實際上可能根本不會遇到的 API 缺陷, 那么下面這個就略打臉了.
    考慮現(xiàn)在要進(jìn)行詞頻統(tǒng)計, 即一個詞在文章中出現(xiàn)了多少次, 如果直接拿  dict  來寫, 大致是
 

def word_count(words): 
  count = dict() 
  for word in words: 
    count.setdefault(word, 0) += 1
  return count 
 
print word_count(['hiiragi', 'kagami', 'hiiragi', 'tukasa', 'yosimizu', 'kagami'])

    當(dāng)你興致勃勃地跑起上面代碼時, 代碼會以迅雷不及掩臉之勢把異常甩到你鼻尖上 --- 因為出現(xiàn)在  +=  操作符左邊的  count.setdefault(word, 0)  在 Python 中不是一個左值. 怎樣, 現(xiàn)在開始念叨 C艸 類型體系的好了吧.

    因為 Python 把默認(rèn)的字面常量  {}  等價于  dict()  就認(rèn)為  dict  是銀彈的思想是要不得的; Python 里面各種數(shù)據(jù)結(jié)構(gòu)不少, 解決統(tǒng)計問題, 理想的方案是  collections.defaultdict  這個類. 下面的代碼想必看一眼就明白
 

from collections import defaultdict 
 
doc_a = {'id': 'a', 'words': ['word_w', 'word_x', 'word_y']} 
doc_b = {'id': 'b', 'words': ['word_x', 'word_z']} 
doc_c = {'id': 'c', 'words': ['word_y']} 
 
docs = [doc_a, doc_b, doc_c] 
indices = defaultdict(list) 
 
for doc in docs: 
  for word in doc['words']: 
    indices[word].append(doc['id']) 
 
print indices 
 
def word_count(words): 
  count = defaultdict(int) 
  for word in words: 
    count[word] += 1
  return count 
 
print word_count(['hiiragi', 'kagami', 'hiiragi', 'tukasa', 'yosimizu', 'kagami'])

    完滿解決了之前遇到的那些破事.

    此外  collections  里還有個  Counter , 可以粗略認(rèn)為它是  defaultdict(int)  的擴(kuò)展.

相關(guān)文章

  • Python設(shè)計模式之外觀模式實例詳解

    Python設(shè)計模式之外觀模式實例詳解

    這篇文章主要介紹了Python設(shè)計模式之外觀模式,結(jié)合實例形式詳細(xì)分析了外觀模式的概念、原理、用法及相關(guān)操作注意事項,需要的朋友可以參考下
    2019-01-01
  • python 單線程和異步協(xié)程工作方式解析

    python 單線程和異步協(xié)程工作方式解析

    這篇文章主要介紹了python 單線程和異步協(xié)程工作方式解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Python數(shù)據(jù)可視化之用Matplotlib繪制常用圖形

    Python數(shù)據(jù)可視化之用Matplotlib繪制常用圖形

    Matplotlib能夠繪制折線圖、散點(diǎn)圖、柱狀圖、直方圖、餅圖. 我們需要知道不同的統(tǒng)計圖的意義,以此來決定選擇哪種統(tǒng)計圖來呈現(xiàn)我們的數(shù)據(jù),今天就帶大家詳細(xì)了解如何繪制這些常用圖形,需要的朋友可以參考下
    2021-06-06
  • Python?socket之TCP通信及下載文件的實現(xiàn)

    Python?socket之TCP通信及下載文件的實現(xiàn)

    本文主要介紹了Python?socket之TCP通信及下載文件的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python將時分秒轉(zhuǎn)換成秒的實例

    python將時分秒轉(zhuǎn)換成秒的實例

    今天小編就為大家分享一篇python將時分秒轉(zhuǎn)換成秒的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 五個提升Python的執(zhí)行效率的技巧分享

    五個提升Python的執(zhí)行效率的技巧分享

    python作為使用最廣泛的編程語言之一,有著無窮無盡的第三方非標(biāo)準(zhǔn)庫的支持。但python有一個經(jīng)常被人詬病的缺點(diǎn)那就是運(yùn)行速度,所以本文和大家分享了五個提升Python的執(zhí)行效率的技巧,希望對大家有所幫助
    2023-04-04
  • Python字典底層實現(xiàn)原理詳解

    Python字典底層實現(xiàn)原理詳解

    今天小編就為大家分享一篇Python字典底層實現(xiàn)原理詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python自動化測試pytest中fixtureAPI簡單說明

    Python自動化測試pytest中fixtureAPI簡單說明

    這篇文章主要為大家介紹了Python自動化測試pytest中fixtureAPI的簡單說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • 使用python實現(xiàn)一個簡單的圖片爬蟲

    使用python實現(xiàn)一個簡單的圖片爬蟲

    在本文中,我們將學(xué)習(xí)如何使用Python創(chuàng)建一個簡單的圖片爬蟲,我們將利用requests庫來發(fā)送HTTP請求,BeautifulSoup庫來解析HTML頁面,以及os和shutil庫來下載和保存圖片,通過這個教程,你將學(xué)會如何爬取網(wǎng)頁上的圖片并保存到本地,需要的朋友可以參考下
    2024-02-02
  • Python爬蟲之爬取最新更新的小說網(wǎng)站

    Python爬蟲之爬取最新更新的小說網(wǎng)站

    這篇文章主要介紹了Python爬蟲之爬取最新更新的小說網(wǎng)站,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)python爬蟲的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05

最新評論