Python之列表解决实际问题案例(字谜、文件分析)

字谜

字谜通过重新安排单词里的字母,来组成新的单词或词组。例如,将cinema转换成另一个英语单词iceman。在这个例子中,将设计一个程序,检查两个词是否构成字谜。如何做到这一点?做法是找出两个字谜单词所共享的特性。一种典型的方式是将字母排序。考虑前面的例子。如果将两个字谜单词 cinema和iceman中的字母排序,得到的字符串都为aceinn。想想这意味着什么。排序后的列表是 cinema和iceman中字母的另一种重排。对字母排序将得到两个单词的共同表示。
下面是算法描述:
1)输入两个单词
2)对单词进行排序
3)比较两个排序后的单词
第一步为“输入两个单词”,因此需要提示用户输入两个用空格隔开的单词。nput命令将两个单词作为字符串返回,例如,‘cinema iceman’。接下来,利用split来获取列表中每个单词。得到单词列表后,需要抽取这两个单词。

twowords=input("请输入两个单词:")
word1,word2=twowords.split()

第二步进行排序。两个单词都是字符串类型,可以利用sorted()函数返回一个排序号的字母列表。

word1_sorted=sorted(word1)
word2_sorted=sorted(word2)

第三步比较。列表可以直接通过比较运算符进行比较,比较的时候会从第一个元素开始,一一比对,如果有不相同的元素,就会返回假,并停止比较。否则返回真。

if word1_sorted==word2_sorted:
	print("两个单词构成字谜")
else:
	print("两个单词不构成字谜")

整合代码,得到一个判断的函数,两个比较的单词作为函数的参数输入,函数返回true或flase

def isanagame(word1,word2):
	word1_sorted=sorted(word1)
	word2_sorted=sorted(word2)
	if word1_sorted==word2_sorted:
		return True
	else:
		return Flase

现在在加上输入,并调用函数,就可以得到最终的代码了。

def isanagame(word1,word2):
	word1_sorted=sorted(word1)
	word2_sorted=sorted(word2)
	if word1_sorted==word2_sorted:
		return True
	else:
		return Flase
		
twowords=input("请输入两个单词:")
word1,word2=twowords.split()
if isanagame(word1,word2):
	print("两个单词构成字谜")
else:
	print("两个单词不构成字谜")

文件分析

程序员常常需要用各种方法对文本文件进行分析。让我们利用列表来分析文件。具体要完成的工作如下:

  • 分析文件长度,按单词计数。
  • 追踪文件中只出现一次的不同单词。

将采用林肯总统的《葛底斯堡演说》(1863)作为示例。这个演说很著名的原因有很多,其中一点就是它非常简短。利用Python来对此演说进行简单分析。

1.《葛底斯堡演说》的长度

len函数返回列表的长度,因此将演说的内容全部放到列表中来获取其长度。一种好的方法是先用空列表,然后使用append方法每次将一个单词添加到列表中。从互联网上下载演说,并把它存放在文件 gettysburg中,将文件与程序放在同一目录下。首先打开文件,逐行读取文件内容。将每行内容读入一个长字符串中,以便于使用split方法来抽取单词并放入列表。可用将演讲列表扩展为每行一个列表的形式(使用extend)。算法如下:
1)打开文件进行读取。
2)初始化演讲列表为空。
3)对文件中的每一行:
(a)将其中的单词抽取出来,并放入一个列表中。
(b)一个个单词地判断是不是空单词“–”,不是的话再将单词添加到演讲列表中。
4)获取演讲列表的长度。

通过观察发现,步骤2)和步骤3)能在一个函数内实现,这个函数将创建演讲内容的单词列表。调用函数makewordlist,把它合并到打开文件的程序中,调用函数,然后显示出结果。

#输入一个文件,返回单词列表
def makewordlist(gFlie):
	speech=[]    #空列表
	for lineString in gFile:  #一行一行地循环
		lineList=lineString .split()   #空格分隔,得到单词列表
		for w in lineList:
			if w !="--":
				speech.append(w)   #符合要求的加到总列表中
	return speech

gFile=open("gettysburg.txt","r")   #打开文件
speech=makwordlist(gFile)    #得到单词列表
print("文章的单词长度为:%d"%len(speech))

2、有多少个不同的单词

先建立不同单词的列表,然后计算该列表的长度。首先创建唯一单词的空列表(请注意采用合适的模式)。接下来逐个单词遍历speech列表,检查该单词是否已在唯一单词列表中如果不存在,则将单词添加到列表中。检查的时候还要注意,大小写不同的也是同一个单词,有些单词后面带有标点符号要先去掉再比较。具体算法如下:
1)初始化唯一单词列表为空
2)对演说中每个单词:
(a)对单词全部变成小写
(b)用strip去掉指定字符
©如果该单词不在列表中:
(b)将单词添加在列表中。
编一个函数来实现算法,该函数命名为makeUnigue。

def makeUnique(speech):
	unique=[]    #空列表存放不同的单词
	for word in speech:
		word=word.lower().strip(",.")   #变小写后去指定符号
		if word not in unique:
			unique.append(word)    #把列表里没有的单词放进来
	return unique

在主函数中加入

unique=makeUnique(speech)
print("文章中不同的单词有:")
print(unique)
print("一共有%d个不同的单词。"%len(unique))
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值