字谜
字谜通过重新安排单词里的字母,来组成新的单词或词组。例如,将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))