[python]变位词的判别与分类
作者:互联网
最近老师留了个作业,是对近12万的单词进行变位词的判断与分类,最开始博主按着非常普通的想法,先写了个函数来判断两个单词是不是变位词,然后再对所有单词遍历判别。因为单词数量实在是多,所以运行时间很长。所以就改变了一下思路(看了同学的code):
首先也是遍历所有单词,不同的是,需要将每个单词的字母顺序排列,存为一个字符串(记为字典的键,对应的值为一个列表,列表中存放互为变位词的所有单词)。
然后对每一单词,如果这个单词对应的顺序字母串存在于字典的键中,则把这个单词加到键对应的值(列表)中;
若是这个单词对应的顺序字母串不存在于字典的键中,则这个单词也添加到键对应的值(列表)中。
所以最后的字典是这样的一种形式:键为顺序字母串,值为一个列表,该列表至少含有一个单词。
附上近12万单词的txt文件
code:
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 26 16:45:50 2019
@author: buu
"""
def find_anagram():
filename1="words.txt"
filename2="anagrams.txt"
max_group=0
max_word=0
words_dict={} # 键为按顺序排列的字母:值为一个列表,列表含有互为变位词的单词
with open(filename1) as f1:
words=f1.readlines()
for word in words:
a=list(word.strip())
a.sort()
s=''
for cha in a:
s+=cha
if s not in words_dict.keys():
words_dict[s]=[]
words_dict[s].append(word.strip())
else:
words_dict[s].append(word.strip())
b=[]
lgroup=0
lword=0
cnt=0
with open(filename2,'w') as f2:
for value in words_dict.values():
if len(value)>1:
cnt+=1
for word in value:
if len(word)>lword:
lword=len(word)
if(len(value)>lgroup):
lgroup=len(value)
f2.write(str(value).replace('[','').replace(']','').replace('\'',''))
f2.write('\n')
f2.write('\n')
f2.write('=== anagrams 组的统计信息 ===\n')
f2.write('There are {0} anagram groups in the dictionary.\n'.format(cnt))
f2.write('max_group={0},max_word={1}.\n'.format(lgroup,lword))
f2.write("组长度为{0}的 max_group 的组如下:\n".format(lgroup))
for value in words_dict.values():
if len(value)==lgroup:
f2.write(str(value).replace('[','').replace(']','').replace('\'',''))
f2.write('\n')
f2.write("单词长度为 {0} 的组如下:\n".format(lword))
for value in words_dict.values():
if len(value)>1 and len(value[0])==lword:
f2.write(str(value).replace('[', '').replace(']', '').replace('\'', ''))
f2.write('\n')
if __name__ == '__main__':
find_anagram()
然后将结果输出到某个txt文件中,结果如下:
end
标签:write,f2,word,判别,变位,python,value,单词,words 来源: https://blog.csdn.net/weixin_44321080/article/details/102758432