python練習冊第四題
阿新 • • 發佈:2018-11-26
題目
任一個英文的純文字檔案,統計其中的單詞出現的個數。
解題思路
上網找了一下思路。首先要讀取文字,對文字進行處理——這裡的處理要包括去除空格及各個標點符號。處理好的文字就是一串單詞,可以用list儲存。接下來,就是統計list中各單詞的重複次數了,最簡單的想法,應該是一個個遍歷,將之前未出現的錄入一個dict中,出現過的增加個數。
解決程式碼
寫起來很簡單。其中defaultdict
與dict
幾乎一樣,但可以起到設定預設值的作用,如果不存在就會設定預設值為0;也可以用條件判斷解決。
唯一的難點就是如何排序,dict型別是無法排序的,所以需要藉助函式sort
,sort
接收四個引數,第一個是iterable
iterable
值。
import re from collections import defaultdict if __name__ == '__main__': w_dict = defaultdict(int) with open('subtitle.txt', 'r') as fp: for line in fp.readlines(): s_list = re.split(r'[\s\,\.\?\"]+', line.strip()) for w in s_list: w_dict[w] += 1 # 不會報錯,設定預設值為0 for w in sorted(w_dict, key=w_dict.get, reverse=True): print(w, w_dict[w])
修改
import re from collections import defaultdict # filter()也接收一個函式和一個序列。和map()不同的時,filter()把傳入的函式依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素。 if __name__ == '__main__': w_dict = defaultdict(int) with open('subtitle.txt', 'r') as fp: article = fp.read().replace('\n', ' ') s_list = re.split(r'[\s\,\.\?\"]+', article) s_list = [item for item in filter(lambda x: x != '', s_list)] # 去掉空串,空串出現在最後一個逗號後面 for w in s_list: w_dict[w] += 1 for w in sorted(w_dict, key=w_dict.get, reverse=True): print(w, w_dict[w])
別人的程式碼
嗯,沒什麼好說的。。
import string
# simply extend word like: it's => it is
def extend_word(text):
if text.find('\'') > 0:
old2new = dict()
words = text.split()
for word in words:
if word.find('\'') > 0:
parts = word.split('\'')
if parts[1] == 'm':
parts[1] = 'am'
elif parts[1] == 's':
parts[1] = 'is'
elif parts[1] == 're':
parts[1] = 'are'
elif parts[1] == 't':
parts[1] = 'not'
elif parts[1] == 've':
parts[1] = 'have'
elif parts[1] == 'll':
parts[1] = 'will'
elif parts[1] == 'd':
if words[words.index(word) + 1] == 'better':
parts[1] = 'had'
else:
parts[1] = 'would'
if parts[0].endswith('n'):
parts[0] = parts[0][:-1]
old2new[word] = ' '.join(parts)
_text = text
for old_word in old2new.keys():
_text = _text.replace(old_word, old2new[old_word])
return _text
def return_order_key(record):
return record[1]
def show_in_order(records):
items = sorted(records.items(), key=return_order_key, reverse=True)
for item in items:
print(item[0], item[1])
with open('subtitle.txt', 'r') as file:
article = file.read()
no_pun_text = article
_punctuation = string.punctuation.replace('\'', '')
for pun in _punctuation:
no_pun_text = no_pun_text.replace(pun, '')
complete_text = extend_word(no_pun_text)
records = dict()
for word in complete_text.lower().split():
records[word] = records.get(word, 0) + 1
show_in_order(records)