python练习册第四题

python练习册第四题目录目录题目解题思路解决代码修改别人的代码题目任一个英文的纯文本文件,统计其中的单词出现的个数。解题思路上网找了一下思路。首先要读取文本,对文本进行处理——这里的处理要包括去除空格及各个标点符号。处理好的文本就是一串单词,可以用list储存。接下来,就是统计list中各单词的重复次数了,最简单的想法,应该是一个个遍历,将之前未出现的录入

大家好,欢迎来到IT知识分享网。python练习册第四题"

目录

题目

任一个英文的纯文本文件,统计其中的单词出现的个数。

解题思路

上网找了一下思路。首先要读取文本,对文本进行处理——这里的处理要包括去除空格及各个标点符号。处理好的文本就是一串单词,可以用list储存。接下来,就是统计list中各单词的重复次数了,最简单的想法,应该是一个个遍历,将之前未出现的录入一个dict中,出现过的增加个数。

解决代码

写起来很简单。其中defaultdictdict几乎一样,但可以起到设置默认值的作用,如果不存在就会设置默认值为0;也可以用条件判断解决。

唯一的难点就是如何排序,dict类型是无法排序的,所以需要借助函数sortsort接收四个参数,第一个是iterable,即可迭代参数,而dict就是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)

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/22519.html

(0)
上一篇 2024-01-01 08:00
下一篇 2024-01-01 21:15

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信