当前位置: 首页 > news >正文

python编写一个排序函数要求数据输入_python自学日记9——选择数据结构

1.编写一个程序从文件中读入一个单词列表,并打印出所有是回文的单词集合

这次的回文和以前理解的回文不一样,例子如下:

['deltas','desalt','lasted','salted','slated','staled']

['retainers','ternaries']

只要都是相同字母组成的单词都算在回文的单词集合中

按照抓取关键信息转化成自己已经掌握的方法原则,我有两个大致方向,一个是挨个读取每个单词,把单词用前面所说的字母词频计数器分解单词,如果词频计数相同的放到一个集合中;另一个方向是将26个字母通过排列组合方式组成各个单词然后去单词表中比对,显然第二个方法违反了最初的原则,因为这个并没有在我目前的掌握之中,而且特复杂,计算量大。

但是后面发现还有更简单的方法,就是利用已经掌握的排序功能,将每个单词的字母分拆并排序,如果结果相同的放到一个集合里。

def paixu_pinjie(word):

t=list(word)

t.sort()

a=''.join(t)

return a

fin=open('words.txt')

d=dict()

for line in fin:

word=line.strip()

b=paixu_pinjie(word)

if b not in d:

d[b]=word

else:

d[b].append(word)

return d

for key,val in d.items():

if len(val)>1:

print(val)

---------------------------------------------------------------------------

AttributeError Traceback (most recent call last)

in async-def-wrapper()

17 return d

18

---> 19 for key,val in d.items():

20 if len(val)>1:

21 print(val)

AttributeError: 'str' object has no attribute 'append'

这里发现问题在d[b]=word上,word是字符串,所以不能使用append,如果想在后面添加单词编程单词集合,需要将word变成列表:

def paixu_pinjie(word):

t=list(word)

t.sort()

a=''.join(t)

return a

fin=open('words.txt')

d=dict()

for line in fin:

word=line.strip()

b=paixu_pinjie(word)

if b not in d:

d[b]=[word]

else:

d[b].append(word)

return d

for key,val in d.items():

if len(val)>1:

print(val)

这样倒是不报错了,但是发现输出结果里有一个单词的集合,显然最后的for循环后面的代码没生效,发现是因为for上面的return导致的,按说return只能在函数里使用,现在有两个解决方案,一个是把这个return删除,另一个是把上面的写成一个函数。

def paixu_pinjie(word):

t=list(word)

t.sort()

a=''.join(t)

return a

def all_anagrams(filename):

fin=open(filename)

d=dict()

for line in fin:

word=line.strip().lower()

b=paixu_pinjie(word)

if b not in d:

d[b]=[word]

else:

d[b].append(word)

return d

def print_anagram_set(d):

for key,val in d.items():

if len(val)>1:

print(val)

d=all_anagrams('words.txt')

print_anagram_set(d)

将上面代码改成了函数,另外在word=line.strip()后面加上了.lower(),需要将大写字母变成小写字母。决定是否将一段代码写成函数的原则是,这段代码是否会被重复使用,还有这段代码是否可以单独拆出来不用。

修改前面问题的程序,按照集合内单词数量倒序打印。

def print_anagram_sets_in_order(d):

t=list() #建一个空列表储存数据

for key,val in d.items():

if len(val)>1:

t.append((len(val),val))

t.sort(reverse=True) #排序

#按倒序打印

for x in t:

print(x)

print_anagram_sets_in_order(d)

因为后面需要重新使用上面的部分代码,所以需要将其中一部分转换为函数,否则就得重新写一遍。

2.编写一个choose_from_hist,接受一个直方图作为参数,并从直方图中,按照频率大小,成比例的随机返回一个值

直方图在“python自学日记7——字典”中有写过,通过这个也想起有人问过一个关于什么是好的python学习资料的问题,我决定一个好的学习资料其中有一点就是能把前后的知识点通过练习题的方式串起来。其他的再单独找时间一起说一下。

直方图函数早已经写过了,剩下的就是根据概率随机取值了。从官方文档中看到random中有choices是符合这个要求,其中有个关键参数weights是可以在列表中根据weights后面的列表中每个数占总数的概率取值的,具体到本例中,直方图会得出一个字典,包含没给字母和对应字母出现的词频,我们可以将字典中键和值分成两个列表,键的列表作为随机取值的列表,值的列表则赋值给weights作为前面取值的概率,得出如下代码

def histogram(s):

d=dict()

for c in s:

d[c]=int(d.get(c,'0'))+1 #get可接收一个键和默认值,如果字典中有这个键,返回键对应值,否则返回默认值

return d

def choose_from_hist(s):

d=histogram(s) #在直方图函数结果基础上又运行了一次函数

a=[]

b=[]

for key,val in d.items():

a.append(key)

b.append(val)

print(a) #键的列表

print(b) #值的列表

return random.choices(a,weights=b,k=20)

h=histogram('aaaaaabb')

choose_from_hist(h)

['a', 'b']

[1, 1]

结果返回值中值列表本来应该是[6,2]结果是[1,1],查看原因是发现,直方图函数运行了两次,也就是已经传入了直方图函数作为参数,有运行了一次直方图函数。所以去掉函数内运行直方图代码即可

def histogram(s):

d=dict()

for c in s:

d[c]=int(d.get(c,'0'))+1

return d

def choose_from_hist(s):

a=[]

b=[]

for key,val in d.items():

a.append(key)

b.append(val)

print(a)

print(b)

return random.choices(a,weights=b,k=5) #k是一次去k个随机数

h=histogram('aaaaaabb')

choose_from_hist(h)

['a', 'b']

[6, 2]

Out[85]:

['a', 'a', 'a', 'a', 'b']

相关文章:

  • python输出语句print_Python每日3题print(c)会输出什么?
  • 命令行参数python sys模块_Python中处理命令行参数的3种方法
  • python菜鸟教程for循环_Python for 循环语句
  • 格力手机2 官方固件_格力悄悄上线首部双模5G手机:搭载骁龙765G,售价2699元起...
  • c#怎么拟合函数得到参数_数值计算(三十七)给定函数的参数拟合
  • python decorators_Python进阶之强大的装饰器 Decorators (一)
  • 设备能力指数cmk计算公式_拧紧微课堂|关于CM,CMK,CP,CPK
  • sql 转置_SQL -- 练习汇总
  • python语言中打印到屏幕上的函数是什么_Python基础之白话说函数
  • 概率论与数理统计思维导图_2020年基础考试高等数学思维导图
  • 用python画圆角矩形_如何用OpenCV绘制圆角矩形(带圆角的矩形)?
  • vfp控制excel选择全表_Excel快速填充功能,让你输入数据不只是快一点点
  • 遍历list 分组求和_LeetCode刷题实战49:字母异位词分组
  • spark labeledpoint函数用法_Hive常用的函数总结
  • python字符串子串替换方法_python替换字符串中的子串图文步骤
  • [译]如何构建服务器端web组件,为何要构建?
  • 【5+】跨webview多页面 触发事件(二)
  • 0基础学习移动端适配
  • android 一些 utils
  • C++入门教程(10):for 语句
  • HashMap剖析之内部结构
  • iOS 颜色设置看我就够了
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript对象详解
  • Python连接Oracle
  • Redis字符串类型内部编码剖析
  • 搭建gitbook 和 访问权限认证
  • 给第三方使用接口的 URL 签名实现
  • 记录:CentOS7.2配置LNMP环境记录
  • 聚类分析——Kmeans
  • 学习HTTP相关知识笔记
  • HanLP分词命名实体提取详解
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • # 数据结构
  • #NOIP 2014# day.1 T2 联合权值
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $L^p$ 调和函数恒为零
  • (C语言)字符分类函数
  • (阿里云万网)-域名注册购买实名流程
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)计算机毕业设计高校学生选课系统
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)图像的%2线性拉伸
  • (转)VC++中ondraw在什么时候调用的
  • (转)创业的注意事项
  • (转)甲方乙方——赵民谈找工作
  • (转)重识new
  • .Net FrameWork总结
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中 GetProcess 相关方法的性能