• CDays3 习题二 (字典及文件读取练习)及相关内容解析。Python 基础教程


    读取某一简单索引文件cdays-3-test.txt,其每行格式为文档序号 关键词,现需根据这些信息转化为倒排索引,即统计关键词在哪些文档中,格式如下:包含该关键词的文档数 关键词 => 文档序号。其中,原索引文件作为命令行参数传入主程序,并设计一个collect函式统计 "关键字<->序号" 结果对,最后在主程序中输出结果至屏幕。

    在附录中,我们给出该文件内容。

    好了,让我们分析这个问题。 先理解“倒排索引”的概念。就是把Key变成索引。

    这样的数据结构我们可以用字典来实现,因为我们不知道要有多少个表,要有多少个数组。

    我们找到一个关键词就新建一个Key ,Value中存放序号,如果字典中存在这个key ,那么扩增value ,由于是list,所以我们用列表方法append

    我们假定文件存储在  D:\\Days-3-test.txt

    而且要用函数来解决这个问题。

    location='D:\\Days-3-test.txt'
    
    def collect(file):
        result = {}   #  定义一个空字典
        for line in file.readlines( ):
            left,right = line.split( )
            if right in result :
                result[right].append(left)  #添加进列表
            else:
                result[right]=[left]        #如果字典中没有该值,那么新建一个Key
        return result
    
    a_file=open(location,'r')
    result = collect(open(location,'r'))    #读取文件
    print result

    image

    现在我们得到了正确的字典,我们已经很接近最后的程序了。

    我们还需要做一个事情,计数,显然是字典中的计数,让我们先找一下字典中有没有这样的方法。

    对,这并不是字典中的问题,字典中的每一个Key对应一个value ,但是,它的每个值是一个list,那么,这个问题划归到list中有多少个对象的问题了。

    so easy~

    len( result[ key ] )

    让我们整理一下输出.

    for key in result.keys():
        print '%d %s   =>   %s ' % (len(result[key]),key,result[key] )

    image

    现在看来是那么回事了. 现在给出所有的代码.

    location='D:\\Days-3-test.txt'
    
    def collect(file):
        result = {}   #  定义一个空字典
        for line in file.readlines( ):
            left,right = line.split( )
            if right in result :
                result[right].append(left)  #添加进列表
            else:
                result[right]=[left]        #如果字典中没有该值,那么新建一个Key
        return result
    
    for key in collect(open(location,'r')).keys():
        print '%d %s   =>   %s ' % (len(result[key]),key,result[key] )

    现在看来文件类的问题并不是那么麻烦了。

    附录1. Days-3-test.txt 文件内容. 

    1 key1
    2 key2
    3 key1
    7 key3
    8 key2
    10 key1
    14 key2
    19 key4
    20 key1
    30 key3
  • 相关阅读:
    ExpandoObject与DynamicObject的使用
    ManualResetEvent 线程通信
    CancellationTokenSource 取消任务
    SQL Server 每日一题--老二解析
    说说 C# 8 using 新特性
    SQL Server 每日一题--老二
    C#中的坑--浮点类型
    开胃菜解析
    开胃菜
    快速入门 Arrow 日期处理库
  • 原文地址:https://www.cnblogs.com/Kaysin/p/2910819.html
Copyright © 2020-2023  润新知