前几天在微信上看到一篇文章,大概内容是:假定字母为A为1,B为2,依此类推,最后Z为26。然后,将一个单词拆开,每个字母对应的数字相加,会发现 attitude 这个单词的和是100。然后,就一大堆的bala bala。。。。。。具体见:http://www.360doc.com/content/15/0307/18/14914191_453353996.shtml
个人认为这种东西纯属迷信!压根儿就没有可信度,为了说明这点,我在网上找了份单词表,找出其中求和后等于 100 的单词。具体做法如下:
1. 先清洗数据
由于网上找的单词表包含和词类属性,对应中文意思,如下:
所以,清洗工作就是要把非单词部分去除。先将这些单词存成文本文件,再清洗这些内容,并将清洗后的内容存入另一个文件,代码如下:
import re
f = open('e:\\RowWords.txt')
f1 = open('e:\\NewWords.txt', 'w+')
line = f.readline()
p = re.compile('[a-z]+') # 匹配单词的正则表达式
while line:
mm = p.findall(line)
if mm:
s = mm[0] # 取列表中的第一个元素,也就是单词
print s
s = s +'\n' # 每个单词后加个换行符
f1.write(s) # 将单词写入新的文件
line = f.readline()
f.close()
f1.close()
2. 统计单词字母之和
每个字母都有一个对应的ASCII 码值,而且大、小写字母的值也不一样。好在这份单词表中的字母都是小写,可以不做字母的转换。但要让字母表计数从1开始,也就是字母 a 对应值是1,而不是ASCII 码中的97。
import re
f = open('e:\\NewWords.txt')
f1 = open('e:\\100Words.txt', 'w+')
line = f.readline()
while line:
line = line.strip('\n') # 去除单词后的换行符
n = len(line) # 计算单词长度
l = list(line) # 将字符串转换成列表
sum = 0
for i in range(n):
sum = sum + (ord(l[i])-96) # 让每字母表从1开始计数,并且将字母对应的数字累加
if sum == 100: # 如果单词字母之和等于 100
print line, sum
line = line + '\n'
f1.write(line) # 将字母之和等于 100 的单词写入新的文件
line = f.readline()
f.close()
f1.close()
输出结果如下:
accumulate
acknowledge
alienation
analysis
annually
attitude
awfully
boundary
boycott
carpenter
clockwise
companion
congress
corridor
culture
delivery
denominate
discipline
elsewhere
excellent
fountain
hospital
immature
inefficient
inflation
innovate
intellect
interfere
irritate
lightning
likelihood
maximize
mercantile
molecular
ornament
outset
papercut
pasture
personal
perturb
prevent
primary
printer
producer
publicly
pumpkin
pursue
pussy
quarter
reciprocal
refinery
reputable
researcher
restore
session
shipyard
simulate
snobbery
socialism
status
stress
surcharge
surely
telephone
telescope
therefore
therefore
thirty
turkey
useless
utensil
variety
whenever
wholesale
writing