【代码】统计文件中,不同字符出现的次数(可排序,没有处理英文单词、数字和大小写)

上次代码有逻辑问题,如下:

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')

这一点东西弄了一两天,真是…脑子不好使了,毛糙。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值