射雕英雄传人物关系python_Python数据分析——谁才是《三体》的主角?

准备工作

matplotlib库

三体.txt(utf-8编码)

三体主要人物.txt(utf-8编码)

代码

大纲

导入matplotlib.pyplot方法,创建1个Novel类,包含2个属性和4个方法。

import matplotlib.pyplot as plt

class Novel():

"""创建一个小说的类"""

def __init__(self, novel_name, roles_name):

"""初始化类的属性"""

def one_role_nums(self, role_name):

"""统计一个人物名字出现的次数"""

def main_roles_nums(self):

"""统计主要人物名字出现的次数"""

def show_datas(self):

"""输出人物名字及出现次数"""

def draw_picture(self, title = ""):

"""可视化数据"""

初始化

类包含两个属性,小说名字和主要人物名字。

主要人物来源于《三体》百度百科,以每行一个名字的格式存储于txt文档,如下图。

注:艾aa的名字采用aa,因小说中多称呼aa。

o_2001100153141496686-20181216134731005-1880218792.png

def __init__(self, novel_name, roles_name):

"""初始化类的属性"""

self.novel_name = novel_name

self.roles_name = roles_name

方法

one_role_nums方法

def one_role_nums(self, role_name):

"""统计一个人物名字出现的次数"""

with open(self.novel_name, encoding = 'utf-8') as f:

content = f.read()

count = 0

n = len(role_name)

for i in range(len(content)):

if content[i : i + n] == role_name:

count += 1

return count

main_roles_nums方法

返回一个列表,列表元素为字典中的键值对且按value降序排列。

def main_roles_nums(self):

"""统计主要人物名字出现的次数"""

with open(self.roles_name, encoding = 'utf-8') as f:

names = [line.strip() for line in f.readlines()]

dic = {}

for name in names:

num = self.one_role_nums(name)

if num:

dic[name] = num

dic = sorted(dic.items(), key = lambda k : k[1], reverse = True)

return dic

show_datas方法

def show_datas(self):

"""输出人物名字及出现次数"""

dic = self.main_roles_nums()

for x in dic:

print(x[0], x[1])

draw_picture方法

运用matplotlib库将所得数据可视化。

调用方法时可赋予一个标题,默认为空。

def draw_picture(self, title = ""):

"""可视化数据"""

dic = self.main_roles_nums()

names, nums = [], []

for x in dic:

names.append(x[0])

nums.append(x[1])

n = list(range(len(names)))

plt.figure(figsize=(10, 6))

plt.bar(n, nums, alpha=0.5)

plt.xlim((0, len(names)))

plt.xticks(n, names, rotation = 30, fontproperties = "SimHei", fontsize = 24)

plt.title(title, fontproperties = "SimHei", fontsize = 40)

plt.show()

调用

创建一个对象,赋予两个属性。

novel = Novel("三体.txt", "三体主要人物.txt")

调用方法show_datas()

novel.show_datas()

o_2001100153141496686-20181216134731005-1880218792.png

调用方法draw_picture()并赋予一个标题

novel.draw_picture("三体主要人物名字出现次数")

o_200109033503demo.png

结果符合预期,汪淼、罗辑和程心是当之无愧的三大主角,且随着《三体I》《三体II》《三体III》小说的篇幅增多而名字出现次数增多。

其他人物名字出现的次数基本与观感相符合。

分析射雕三部曲

再以同样的方法分析射雕三部曲,可以发现,张无忌主角光环最甚。

dic = {"射雕英雄传.txt":"射雕英雄传主要人物.txt",

"神雕侠侣.txt":"神雕侠侣主要人物.txt",

"倚天屠龙记.txt":"倚天屠龙记主要人物.txt"}

for key, value in dic.items():

novel = Novel(key, value)

novel.draw_picture()

射雕英雄传

o_2001100154251496686-20181217124543098-501165011.png

神雕侠侣

o_2001100154311496686-20181217124550786-769936440.png

倚天屠龙记

o_2001100154391496686-20181217124558636-1957447197.png

GitHub

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值