Python-5 基本对象-字符串与字典的应用

1 问题描述

​ 你需要编写一个函数 analyze_text(text: str) -> dict,该函数接收一个字符串 text,并返回一个字典,其中包含以下信息:

  1. 字符串中每个字母的出现频率(不区分大小写);
  2. 字符串中每个单词的出现频率,单词以空格分隔

2 示例输入、输出

2.1 示例输入

text = "Hello world! Hello Python. Hello, Python world."

2.2 示例输出

{
    'letters': {'h': 3, 'e': 3, 'l': 6, 'o': 4, 'w': 2, 'r': 2, 'd': 2, 'p': 2, 'y': 1, 't': 1, 'n': 1},
    'words': {'hello': 3, 'world': 2, 'python': 2}
}

3 解决方案

​ 方案流程图如下:

在这里插入图片描述

​ 整体代码如下:

# 题目1: 字符串与字典的应用

def analyze_text(text: str) -> dict:
    """分析文本,返回字母和单词的频率统计。"""
    from collections import Counter
    import string

    # 转换为小写以进行不区分大小写的统计
    text = text.lower()
    
    # 统计字母的出现频率
    letter_counts = Counter(c for c in text if c in string.ascii_lowercase)
    
    # 统计单词出现的频率
    words = text.split()
    word_counts = Counter(word.strip(string.punctuation) for word in words)
    
    return {
        'letters': dict(letter_counts),
        'words': dict(word_counts)
    }

# 测试函数
text = "Hello world! Hello Python. Hello, Python World."
print(analyze_text(text))

4 代码解析

4.1 函数定义

def analyze_text(text: str) -> dict:
"""分析文本,返回字母和单词的频率统计。"""
  • 定义一个函数 analyze_text,接收一个参数 text,类型为 str(字符串),并返回一个 dict(字典)。

4.2 导入模块

from collections import Counter
import string
  • Countercollections 模块中的一个类,用于统计可迭代对象中元素的频率;

  • string 模块提供了处理字符串的常量和工具,例如 string.ascii_lowercase

4.3 转换为小写

text = text.lower()
  • 将输入的文本全部转换为小写,以确保字母统计不区分大小写。

4.4 统计字母出现的频率

letter_counts = Counter(c for c in text if c in string.ascii_lowercase)
  • 使用生成器表达式 (c for c in text if c in string.ascii_lowercase) 遍历文本中的每一个字符,只统计字母;

  • Counter 自动计算每个字母的出现次数,并返回一个 Counter 对象(其实是一个字典)。

4.5 统计单词出现的频率

words = text.split()
word_counts = Counter(word.strip(string.punctuation) for word in words)
  • text.split() 将文本按空格分割成单词列表;

  • 使用生成器表达式 word.strip(string.punctuation) 去除单词两端的标点符号,然后统计每个单词的出现频率;

  • Counter 返回一个字典,其中包含每个单词及其频率。

4.6 返回结果

return {
    'letters': dict(letter_counts),
    'words': dict(word_counts)
}
  • 返回一个字典,其中包含两个键:'letters''words',分别对应字母频率和单词频率的统计结果。

4.7 测试函数

text = "Hello world! Hello Python. Hello, Python World."
print(analyze_text(text))
  • 创建一个测试文本并调用 analyze_text 函数,打印结果。

5 补充知识

5.1 外部库collectionsstring

  1. collections 模块

collections 是 Python 的标准库模块之一,提供了许多有用的容器数据类型,它们比内置的数据类型(如 listdicttuple 等)提供了更多的功能。collections 模块中包含以下一些常用的类:

  • Counter: 这是一个专门用于计数的类,继承自 dict,用于统计可迭代对象中元素的频率。Counter 对象的键是元素,值是元素的出现次数。

    """示例用法"""
    from collections import Counter
    counts = Counter('hello world')
    print(counts)
    # 输出: Counter({'l': 3, 'o': 2, ' ': 1, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1})
    
  1. string 模块

string 是 Python 标准库中的一个模块,提供了一些处理字符串的常量和函数。常用的内容包括:

  • string.ascii_lowercase: 包含所有小写字母的字符串,即 'abcdefghijklmnopqrstuvwxyz'
  • string.ascii_uppercase: 包含所有大写字母的字符串,即 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  • string.punctuation: 包含所有标点符号的字符串,例如 !"#$%&'()*+,-./:;<=>?@[\]^_{|}~`。

5.2 string.ascii_lowercase

string.ascii_lowercasestring 模块中的一个常量,它表示所有小写字母的集合,字符串为 'abcdefghijklmnopqrstuvwxyz'。它常用于需要匹配或过滤小写字母的场景,例如:

import string
print(string.ascii_lowercase)
# 输出: 'abcdefghijklmnopqrstuvwxyz'

5.3 生成器表达式

​ 生成器表达式是一种创建生成器的简洁方式,类似于列表推导式,但是它不会立即生成列表,而是返回一个生成器对象。生成器对象是可迭代的,可以逐个产生元素,从而节省内存。生成器表达式的语法如下:

(expression for item in iterable if condition)

示例:

squares = (x * x for x in range(10))  # 创建一个生成器对象
for square in squares:
    print(square)

这段代码生成从0到9的平方数,而不是立即创建一个包含所有平方数的列表。生成器表达式具有延迟计算的特性,只有在需要时才会计算。

5.4 string.punctuation

string.punctuation 是一个包含所有标点符号的字符串。它提供了一个方便的方式来处理和移除标点符号。常用于文本处理时需要去除标点符号的场景。

示例:

import string
print(string.punctuation)
# 输出: '!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~'

​ 在文本处理中,常用 string.punctuation 来移除文本中的标点符号。例如:

import string

text = "Hello, world!"
cleaned_text = text.strip(string.punctuation)
print(cleaned_text)
# 输出: 'Hello, world'

这段代码使用 strip 方法去除字符串两端的标点符号。

5.5 小结

  • collections.Counter: 用于计数元素的频率。
  • string.ascii_lowercase: 包含所有小写字母的字符串。
  • 生成器表达式: 一种简洁创建生成器的方法,延迟计算。
  • string.punctuation: 包含所有标点符号的字符串,用于文本处理。

这些工具和概念在文本处理、数据统计等任务中非常有用。

6 总结

​ 这段代码的主要目标是从输入的字符串中提取并统计字母和单词的频率。通过使用 Counter 类来简化统计过程,使得代码更加简洁和高效。所有处理步骤都确保了不区分大小写和去除了单词中的标点符号。

7 致谢

作者特别感谢ChatGPT 4o协助作者完成编程的学习,内容大部分由ChatGPT 4o提供。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值