【100天精通Python】Day61:Python 数据分析_Pandas可视化功能:绘制饼图,箱线图,散点图,散点图矩阵,热力图,面积图等(示例+代码)
目录
1 Pandas 可视化功能
2 Pandas绘图实例
2.1 绘制线图
2.2 绘制柱状图
2.3 绘制随机散点图
2.4 绘制饼图
2.5 绘制箱线图A
2.6 绘制箱线图B
2.7 绘制散点图矩阵
2.8 绘制面积图
2.9 绘制热力图
2.10 绘制核密度估计图
1 Pandas 可视化功能
pandas是一个强大的数据分析库,提供了一些可视化工具来帮助用户更好地理解和展示数据。以下是pandas可视化工具的一些常见功能:
1. 折线图:通过plot()函数可以绘制折线图,展示数据随时间或其他变量的变化趋势。
2. 散点图:使用scatter()函数可以绘制散点图,在二维平面上展示两个变量之间的关系。
3. 条形图:使用bar()函数可以绘制条形图,用于比较不同类别或组的数值大小。
4. 直方图:使用hist()函数可以绘制直方图,用于展示数值型数据的分布情况。
5. 饼图:使用pie()函数可以绘制饼图,展示不同类别的占比情况。
6. 箱线图:使用boxplot()函数可以绘制箱线图,展示数值型数据的分布特征、离群值等。
Pandas 是一个用于数据处理和分析的流行库,它提供了一些内置的可视化功能,通常基于 Matplotlib 这个底层库。
-
绘制线图:
df['column_name'].plot(kind='line')
绘制柱状图:
df['column_name'].plot(kind='bar')
绘制散点图:
df.plot(x='x_column', y='y_column', kind='scatter')
hist()函数:hist()函数用于绘制直方图,以显示数据的分布和频率。
df['column_name'].hist(bins=10)
boxplot()函数:boxplot()函数用于绘制箱线图,显示数据的分位数和离群值。
df.boxplot(column='column_name')
scatter_matrix()函数:scatter_matrix()函数用于绘制多个变量之间的散点图矩阵,有助于了解变量之间的关系。
from pandas.plotting import scatter_matrixscatter_matrix(df, alpha=0.5, figsize=(8, 8), diagonal='hist')
plotting.scatter_matrix()函数:这是一个更高级的散点图矩阵绘制函数,可以自定义每个子图的属性。
from pandas.plotting import scatter_matrixscatter_matrix(df, alpha=0.5, figsize=(8, 8), diagonal='kde', color='red')
plot.barh()函数:plot.barh()函数用于绘制水平柱状图。
df['column_name'].plot(kind='barh')
plot.pie()函数:plot.pie()函数用于绘制饼图,用于显示数据的占比。
df['column_name'].plot(kind='pie', autopct='%1.1f%%')
plot.area()函数:plot.area()函数用于绘制堆叠面积图,显示数据的累积变化趋势。
df.plot.area()
plot.kde()函数:plot.kde()函数用于绘制核密度估计图,显示数据的概率密度分布。
2 Pandas绘图实例
2.1 绘制线图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# 创建数据
data = {'年份': [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017],'销售额': [100, 150, 120, 180, 200, 250, 300, 280]}# 转换为DataFrame格式
df = pd.DataFrame(data)# 绘制折线图
plt.plot(df['年份'], df['销售额'], marker='o')# 设置x轴和y轴标签、标题
plt.xlabel('年份')
plt.ylabel('销售额')
plt.title('销售额变化趋势')# 添加图例
plt.legend(['销售额'])# 显示图形
plt.show()

当使用Pandas绘制柱状图、散点图和饼图时,您可以使用plot()函数的不同kind参数来指定要绘制的图表类型。
2.2 绘制柱状图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 替换为您系统中支持的字体
# 创建一个示例DataFrame
data = {'Category': ['A', 'B', 'C', 'D'],'Values': [10, 15, 7, 12]}df = pd.DataFrame(data)# 绘制柱状图
df.plot(x='Category', y='Values', kind='bar', title='柱状图')
plt.xlabel('类别')
plt.ylabel('数值')
plt.show()

2.3 绘制随机散点图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 替换为您系统中支持的字体
# 生成随机数据
np.random.seed(0) # 设置随机种子以确保可重复性
num_points = 100
x = np.random.rand(num_points) # 随机生成x坐标
y = np.random.rand(num_points) # 随机生成y坐标
colors = np.random.rand(num_points) # 随机生成颜色值# 创建DataFrame
data = {'X': x, 'Y': y, 'Color': colors}
df = pd.DataFrame(data)# 绘制散点图
plt.figure(figsize=(8, 6)) # 设置图形大小
plt.scatter(x='X', y='Y', c='Color', data=df, cmap='viridis', alpha=0.7)
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('随机散点图')
plt.colorbar(label='颜色')
plt.show()

上述示例中,我们首先使用NumPy生成了一些随机的x和y坐标数据,以及随机的颜色值。然后,我们将这些数据放入一个Pandas DataFrame 中,并使用Matplotlib绘制了散点图。颜色使用了色彩映射(cmap),并添加了颜色条(colorbar)以显示颜色映射的对应关系。
2.4 绘制饼图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 替换为您系统中支持的字体# 创建一个示例DataFrame,包含不同类别的值
data = {'Category': ['A', 'B', 'C', 'D'],'Values': [10, 15, 7, 12]}df = pd.DataFrame(data)# 指定用于饼图的数值列和标签列
values = df['Values']
labels = df['Category']# 绘制饼图
plt.figure(figsize=(6, 6)) # 设置图形大小
df.plot(y='Values', kind='pie', labels=df['Category'], autopct='%1.1f%%', title='饼图') # 绘制饼图
plt.title('饼图') # 设置图表标题# 显示图表
plt.axis('equal') # 使饼图保持圆形
plt.show()

在上述示例中,首先创建了一个包含类别和对应数值的DataFrame。然后,使用
plt.pie()函数来绘制饼图,其中values包含数值数据,labels包含饼图的标签。autopct参数用于显示百分比标签,startangle参数用于指定饼图的起始角度。最后,使用plt.axis('equal')确保饼图保持圆形。
2.5 绘制箱线图A
import pandas as pd
import matplotlib.pyplot as plt
import random
plt.rcParams['font.sans-serif'] = ['SimHei']# 创建示例数据集
data = {'Product_A': [random.randint(50, 100) for _ in range(50)],'Product_B': [random.randint(40, 90) for _ in range(50)],'Product_C': [random.randint(60, 110) for _ in range(50)],'Product_D': [random.randint(30, 70) for _ in range(50)],'Product_E': [random.randint(20, 80) for _ in range(50)],'Product_F': [random.randint(70, 120) for _ in range(50)]
}df = pd.DataFrame(data)# 使用boxplot()函数绘制箱线图
df.boxplot(column=['Product_A', 'Product_B', 'Product_C', 'Product_D', 'Product_E', 'Product_F'])# 添加标题和标签
plt.title('不同产品销售数据箱线图')
plt.ylabel('销售数量')# 显示图形
plt.show()

在这个示例中,我们创建了一个包含6种产品的示例DataFrame
df,每种产品有50个销售数据点。然后,我们使用boxplot()函数绘制了这6种产品的箱线图。箱线图将展示每种产品的销售数量分布情况,包括中位数、四分位数、离群值等信息。通过比较不同产品的箱线图,您可以更好地了解它们的销售数据分布,以便进行进一步的分析和决策。这种可视化方法可以帮助您分析潜在的销售趋势和异常情况。
2.6 绘制箱线图B
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #替换为系统中支持的字体# 创建一个示例数据集,包括三个组的数据
data = pd.DataFrame({'Group1': np.random.normal(0, 1, 100),'Group2': np.random.normal(2, 1, 100),'Group3': np.random.normal(1, 1, 100),'Group4': np.random.normal(3, 1, 100)
})# 使用boxplot()函数绘制箱线图,指定显示的列和参数
data.boxplot(column=['Group1', 'Group2', 'Group3', 'Group4'],notch=True, # 添加缺口以估计中位数的不确定性sym='o', # 设置异常值标记为圆圈vert=False, # 水平显示箱线图patch_artist=True, # 填充箱体颜色showmeans=True, # 显示均值点meanline=True, # 显示均值线widths=0.5 # 箱体宽度)# 添加标题和标签
plt.title('箱线图示例')
plt.xlabel('值')
plt.ylabel('分组')# 显示图形
plt.show()

在这个示例中,我们创建了一个包含四个组的示例DataFrame
data,每个组有100个随机数。然后,我们使用boxplot()函数绘制箱线图,并自定义了多个参数:
notch=True:在箱体中添加缺口以估计中位数的不确定性。sym='o':将异常值标记为圆圈。vert=False:水平显示箱线图。patch_artist=True:填充箱体颜色。showmeans=True:显示均值点。meanline=True:显示均值线。widths=0.5:设置箱体宽度。其中每个箱体表示一个组的数据分布情况。箱线图还显示了中位数、均值点和异常值。这种可视化工具有助于比较多个组的数据分布,并检测异常值。
2.7 绘制散点图矩阵
pandas.plotting.scatter_matrix()函数用于绘制多个变量之间的散点图矩阵,帮助您了解各个变量之间的关系。这个函数可以自定义每个子图的属性,包括颜色、标记、直方图和核密度估计等。下面是一个详细的示例:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas.plotting import scatter_matrix
plt.rcParams['font.sans-serif'] = ['SimHei']
# 创建一个包含多个变量的示例数据集
data = pd.DataFrame(np.random.randn(100, 4), columns=['A', 'B', 'C', 'D'])# 使用scatter_matrix()函数绘制散点图矩阵
# 主要参数包括DataFrame对象,alpha(透明度),diagonal(对角线上的图表类型),color(颜色),marker(标记类型)等
scatter_matrix(data, alpha=0.8, figsize=(8, 8), diagonal='hist', color='blue', marker='o')# 添加标题
plt.suptitle('散点图矩阵示例')# 显示图形
plt.show()

在这个示例中,我们首先创建了一个包含四个随机变量的示例DataFrame
data。然后,我们使用scatter_matrix()函数绘制散点图矩阵,指定了一些参数:
alpha参数设置透明度,这样可以看到重叠点。figsize参数设置图形的大小。diagonal参数设置对角线上的图表类型,这里使用直方图。color参数设置散点的颜色。marker参数设置散点的标记类型。最后,我们添加了标题并显示图形。
2.8 绘制面积图
面积图 (Area Plot)
面积图用于可视化时间序列或有序数据的变化趋势,通常用于显示数据的累积变化
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']# 创建示例数据集
data = {'Year': [2000, 2001, 2002, 2003, 2004],'Product_A': [100, 120, 140, 160, 180],'Product_B': [80, 90, 110, 130, 150]
}df = pd.DataFrame(data)# 使用plot()函数创建面积图
plt.figure(figsize=(8, 6))
plt.stackplot(df['Year'], df['Product_A'], df['Product_B'], labels=['Product_A', 'Product_B'], alpha=0.7)
plt.xlabel('年份')
plt.ylabel('销售数量')
plt.title('面积图示例')
plt.legend(loc='upper left')
plt.show()
在上述示例中,我们首先创建了一个包含年份和两种产品销售数量的示例DataFrame。然后,使用
stackplot()函数创建面积图,alpha参数设置透明度,labels参数设置图例标签,legend()函数用于显示图例。

2.9 绘制热力图
热力图 (Heatmap)
热力图用于可视化矩阵数据中各个元素之间的关系,通常通过颜色来表示数值的大小。
要在Pandas中绘制热力图,通常需要使用辅助库,最常见的是Seaborn和Matplotlib。Seaborn提供了高级的热力图绘制函数,而Matplotlib用于显示图形。以下是如何在Pandas中使用Seaborn和Matplotlib绘制热力图的示例:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as snsplt.rcParams['font.sans-serif'] = ['SimHei'] #替换为系统中支持的字体# 创建示例数据集
data = np.random.rand(5, 5) # 5x5的随机矩阵# 转换为DataFrame
df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D', 'E'])# 使用seaborn的heatmap()函数创建热力图
plt.figure(figsize=(8, 6))
sns.heatmap(df, annot=True, cmap='coolwarm', linewidths=.5)
plt.title('热力图示例')
plt.show()

在上述示例中,我们首先创建了一个随机矩阵,并将其转换为Pandas DataFrame。然后,使用Seaborn的
heatmap()函数来绘制热力图。参数annot=True用于在图表上显示数值标签,cmap用于设置颜色映射,linewidths用于设置单元格之间的间隔线宽度。
2.10 绘制核密度估计图
plot.kde()函数:plot.kde()函数用于绘制核密度估计图,显示数据的概率密度分布。
import pandas as pd
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] #替换为系统中支持的字体# 创建示例数据集
data = {'Values': [10, 15, 13, 18, 25, 12, 22, 27, 16, 21]}df = pd.DataFrame(data)# 使用plot.kde()函数创建核密度估计图
df['Values'].plot.kde()
plt.xlabel('数值')
plt.ylabel('概率密度')
plt.title('核密度估计图示例')
plt.show()

在这个示例中,我们首先创建了一个包含示例数据的DataFrame
df,然后使用plot.kde()函数绘制核密度估计图。这个图表显示了数据的概率密度分布,它是一个平滑的曲线,代表了数据在不同数值上的概率密度。
相关文章:
【100天精通Python】Day61:Python 数据分析_Pandas可视化功能:绘制饼图,箱线图,散点图,散点图矩阵,热力图,面积图等(示例+代码)
目录 1 Pandas 可视化功能 2 Pandas绘图实例 2.1 绘制线图 2.2 绘制柱状图 2.3 绘制随机散点图 2.4 绘制饼图 2.5 绘制箱线图A 2.6 绘制箱线图B 2.7 绘制散点图矩阵 2.8 绘制面积图 2.9 绘制热力图 2.10 绘制核密度估计图 1 Pandas 可视化功能 pandas是一个强大的数…...
2023华为产品测评官-开发者之声 | 华为云CodeArts征文活动,多重好礼邀您发声!
"2023华为产品测评官-开发者之声"活动激发了众多开发者和技术爱好者的热情,他们纷纷递交了精心编写的产品测评报告。活动社群充满活力,参与者们热衷于交流讨论,互相帮助解决问题,一起探索云技术的无限可能。…...
Python 图形化界面基础篇:获取文本框中的用户输入
Python 图形化界面基础篇:获取文本框中的用户输入 引言 Tkinter 库简介步骤1:导入 Tkinter 模块步骤2:创建 Tkinter 窗口步骤3:创建文本框步骤4:获取文本框中的用户输入步骤5:启动 Tkinter 主事件循环 完整…...
【驱动开发】实现三盏灯的控制,编写应用程序测试
head.h #ifndef __HEAD_H__ #define __HEAD_H__//LED1:PE10 //LED2:PF10 //LED3:PE8#define LED_RCC 0X50000A28 //使能GPIO#define LED_MODER 0X50006000 //设置输出模式 #define LED_ODR 0X50006014 //设置输出高低电平#define LED2_MODER 0X50007000 …...
Vue3+ElementUI使用
<!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"viewport" content"initial-scale1.0,maximum-scale1.0,minimum-scale1.0,user-scalable0, widthdevice-width"/><!-- 引入样式 --><lin…...
MySQL 和 MariaDB 版本管理的历史背景及差异
目录 MariaDB MySQL 差异 关于 SQLE SQLE 获取 了解更多 需要说明的是 MySQL 和 MariaDB 都有社区版和企业版。对于 MySQL,这两个版本都是由同一家公司(Oracle)提供,遵循相同的版本编号体系,企业版包含更丰富…...
linux驱动开发--day4(字符设备驱动注册内部流程、及实现备文件和设备的绑定下LED灯实验)
一、字符设备驱动注册的内部过程 1.分配struct cdev对象空间 2.初始化struct cdev对象 3.注册cdev对象 二、注册字符设备驱动分步实现 1.分配字符设备驱动对象 2.字符设备驱动对象初始化 3.设备号的申请 4.根据申请的设备号和驱动对象注册驱动 三、open函数回调驱动中…...
elasticsearch5-RestAPI操作
个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:三人行,必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud…...
数据结构与算法(一)
文章目录 数据结构与算法(一)1 位运算、算法是什么、简单排序1.1 实现打印一个整数的二进制1.2 给定一个参数N,返回1!+2!+3!+4!+...+N!的结果1.3 简单排序算法2 数据结构大分类、前缀和、对数器2.1 实现前缀和数组2.2 如何用1\~5的随机函数加工出1\~7的随机函数2.3 如何把不…...
Matlab--微积分问题的计算机求解
目录 1.单变量函数的极限问题 1.1.公式例子 1.2.对应例题 1 2.多变量函数的极限问题 3.函数导数的解析解 4.多元函数的偏导数 5.Jacobian函数 6.Hessian矩阵 7.隐函数的偏导 8.不定积分问题的求解 9.定积分的求解问题 10. 多重积分的问题求解 1.单变量函数的极限问题 …...
GRU实现时间序列预测(PyTorch版)
💥项目专栏:【深度学习时间序列预测案例】零基础入门经典深度学习时间序列预测项目实战(附代码数据集原理介绍) 文章目录 前言一、基于PyTorch搭建GRU模型实现风速时间序列预测二、时序数据集的制作三、数据归一化四、数据集加载器…...
文本框粘贴时兼容Unix、Mac换行符的方法源码
本篇文章属于《518抽奖软件开发日志》系列文章的一部分。 我在开发《518抽奖软件》(www.518cj.net)的时候,要在文本框粘贴从别处复制来的名单。发现一个问题,就是一些Unix传过来的多行文本,粘贴后都变成了一行。原来&a…...
2023年华为杯研究生数学建模竞赛辅导
2023年华为杯研究生数学建模竞赛辅导 各研究生培养单位: 中国研究生数学建模竞赛作为教育部学位管理与研究生教育司指导,中国学位与研究生教育学会、中国科协青少年科技中心主办的“中国研究生创新实践系列大赛”主题赛事之一,是一项面向在校…...
post更新,put相当于删除重新增一条
索引数据 //删除后新增 PUT my_dynamic_temp/_doc/1 { “name”:“test”, “class”:“1204” } //覆盖更新 POST my_dynamic_temp/_update/1 { “doc”: { “name”:“test”, “class”:“1203”, “pernum”:“998” } }...
python责任链模式
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到有一个处理者能够处理它为止。在Python中,你可以使用多线程来实现责任链模式的框架。 首先,你需要定义一个基础的处理者类,它包含处理请求的方…...
大数据技术准备
Hbase:HBase 底层原理详解(深度好文,建议收藏) - 腾讯云开发者社区-腾讯云 Hbase架构图 同一个列族如果有多个store,那么这些store在不同的region Hbase写流程(读比写慢) MemStore Flush Hbas…...
【力扣周赛】第 362 场周赛(⭐差分匹配状态压缩DP矩阵快速幂优化DPKMP)
文章目录 竞赛链接Q1:2848. 与车相交的点解法1——排序后枚举解法2——差分数组⭐差分数组相关题目列表📕1094. 拼车1109. 航班预订统计2381. 字母移位 II2406. 将区间分为最少组数解法1——排序贪心优先队列解法2——差分数组 2772. 使数组中的所有元素…...
四大函数式接口(重点,必须掌握)
新时代程序员必须要会的 :lambda表达式、链式编程、函数式接口、Stream流式计算 什么是函数式接口 1.函数型接口 package com.kuang.function;import java.util.function.Function;/*** Function函数型接口 有一个输入参数,有一个输出* 只要是函数式接口…...
2023Web前端逻辑面试题
1、现有9个小球,已知其中一个球比其它的重,如何只用天平称2次就找出该球? ①把9个球分成三份,三个一份; ②拿出其中两份进行称量;会分为两种情况 若拿出的两份小球称量结果,重量相等;…...
uniapp中git忽略node_modules,unpackage文件
首先在当前项目的命令行新建.gitignore文件: touch .gitignore再在编辑器中打开该文件,并在该文件中加入需要忽略的文件名: node_modules/ .project unpackage/ .DS_Store 提示:如果以前提交过unpackage文件的话,需…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
