上次代码有逻辑问题,如下:
for each in mStr:
if each in mWord:
if each == '\n':#不修改的话,文件中会执行换行
mWord['[换行]'] = mWord['[换行]'] + 1
else:
mWord[each] = mWord[each] + 1
else:
if each == '\n':
mWord['[换行]'] = 1
else:
mWord[each] = 1
当each为'\n'时,字典里永远不会有这个键,因为转向了'[换行]'。所以只会执行else。[换行]永远被统计成1
以下为新的版本。初步遵守了代码规范。
def characters_statistic返回统一格式的list。
写入格式由def write_list2d_newline控制,增加代码灵活度。
习得:
1.不要混淆变量的元素类型,比如list中的元素是list还是tuple。造成list格式不统一,写入文件出现不该有的括号。
2.元组的元素可以用a[0]和a[1]表示
3.要考虑函数中参数的类型
4.判断类型时,不要忘了输入type
5.减少字符串拼接,增加性能
6.注意参数是一个字符串还是一组字符串
7.不要写错if和elif造成逻辑失控
# coding=gbk
'''
Created on 2015年12月12日
支持:0-不排序,1-降序,2-升序
没有处理英文单词、数字和大小写
@author: Ryan
'''
import myfunctions
def characters_statistic(file_path, if_sort=1):
#file_path:文件路径,如'abc.txt'
#if_sort:0-不排序,1-降序,2-升序
#返回list(元素为元组)
with open(file_path,'r') as mfile:
mstr = mfile.read();
if len(mstr)>= 0:
m_word = {}#字典
for each in mstr:
if each in m_word:
m_word[each] = m_word[each] + 1
else:
m_word[each] = 1
print('字符个数:' + str(len(mstr)) + '。不相同字符:' + str(len(m_word)) + '个。')
m_word['换行'] = m_word.pop('\n')#替换键的名称
m_word['空格'] = m_word.pop(' ')
#mstr转化为m_word字典9(直接打印会有括号),再转化为(键-值)list
#[2](原来为tranList)增加排序:处理字典mWord,返回一个排序好的list
if if_sort == 1:
temp = sorted(m_word.items(),key=lambda x:x[1], reverse=True)
elif if_sort == 2:
temp = sorted(m_word.items(),key=lambda x:x[1], reverse=False)
else:
temp = myfunctions.tran_dict_to_list(m_word)
# =================== 验证是否统计出错 =================
# print(temp)
# print(str(type(temp)) + 'list元素个数' + str(len(temp)))
# print(str(type(temp[0])) + str(temp[0]))
# sum = 0
# for x in m_word.values():
# sum += int(x)
# print('【调试】字符个数为:' + str(len(mstr)))
# print('【调试】统计个数为:' + str(sum))
# ================================================
return temp
else:
print('无内容!')
def write_list2d_newline(mlist, new_file_path):
#写入list(元素为Key-Value元组),添加换行。
if type(mlist) != list:
print('不符合类型!@write_list2d_newline')
return
if len(mlist) > 0 and type(mlist[0]) == tuple:#写入list(元素为Key-Value元组),添加换行
with open(new_file_path, 'w') as m_file_result:
m_file_result.write('不相同字符有' + str(len(mlist)) + '个。\n')
#m_file_result.write(myfunctions.tranDictToStr(m_word))
# *** 把所有string当做一个string写入文件,因为return一个string ***
# *** 所以写入的'\n'直接显示在文件中,而不是执行换行 ***
for ms in mlist:
#写入格式
#m_file_result.write(str(ms[0]) + ':' + str(ms[1]) +'\n')#减少字符串拼接
m_file_result.write(str(ms[0]))
m_file_result.write(':')
m_file_result.write(str(ms[1]))
m_file_result.write('\n')
print('写入成功!@write_list2d_newline')
else:
print('列表不符合格式!@write_list2d_newline')
mlist = characters_statistic('文字统计.txt',0)
write_list2d_newline(mlist, '统计结果(无序).txt')
mlist = characters_statistic('文字统计.txt',1)
write_list2d_newline(mlist, '统计结果(升序).txt')
这一点东西弄了一两天,真是…脑子不好使了,毛糙。