• Head First Python-Python简单处理文件


    前面介绍了自定义格式化输出列表函数printList(),下面再介绍下格式化列表项列表项的排序

     这里有一组列表数据,记录运动员跑步时间的,要求按照时间大小进行排序。这里每项数据记录的时间格式不一样,无法统一排序。(对字符串排序时,短横线-排在点号前面,点号.在冒号:前面。)

     直接排序:

    def get_coach_data(filename):
        try:
            with open(filename) as fn:
                data=fn.readline()
                temp_data=data.strip().split(',') #方法串链
            return (sorted(temp_data))
        except IOError as ioe:
            print('File Error: '+str(ioe))
            return (None)
    james=get_coach_data('./data/james.txt')
    print(james)

    结果:

     我们可以自定义一个函数sanitize()来处理列表项,统一下格式问题。

    1,列表迭代

    #列表迭代
    def sanitize(time_string):
        if '-'in time_string:
            spliter='-'
        elif ':' in time_string:
            spliter=':'
        else:
            return (time_string)
        (mins,secs)=time_string.split(spliter)
        return (mins +'.'+secs)
    
    with open('./data/james.txt') as j:
        data=j.readline()
        temp_james=data.strip().split(',')
        james=[]
        for a in temp_james:
            james.append(sanitize(a))
    print(james)

    这里我们将一个列表转换为另一个列表要做4件事:

    创建一个新列表来存放转换后的数据,迭代处理原列表中的各个数据项,每次迭代时完成转换,将转换后的数据追加到新列表。

    2,列表推导

    列表推导也可以完成上面的功能(排序)。

    #列表推导
    def sanitize(time_string):
        if '-'in time_string:
            spliter='-'
        elif ':' in time_string:
            spliter=':'
        else:
            return (time_string)
        (mins,secs)=time_string.split(spliter)
        return (mins +'.'+secs)
    
    with open('./data/james.txt') as j:
        data=j.readline()
        temp_james=data.strip().split(',')
        james=[sanitize(i) for i in temp_james] #列表推导
    print(james)

    这里不需要append()方法。

    处理好数据后来进行排序,分析所给的数据发现里面有重复项,我们可以用set()来进行处理。

    #列表去重
    def sanitize(time_string):
        if '-'in time_string:
            spliter='-'
        elif ':' in time_string:
            spliter=':'
        else:
            return (time_string)
        (mins,secs)=time_string.split(spliter)
        return (mins +'.'+secs)
    
    with open('./data/james.txt') as j:
        data=j.readline()
        temp_james=data.strip().split(',')
        james=[sanitize(i) for i in temp_james]
        unique_james=[]
        for j in james:#使用迭代删除重复
            if j not in unique_james:
                unique_james.append(j)
    print(unique_james[0:3]) #列表分片
    print(sorted(set(james)))#使用集合删除重复

    运行结果如下:

    我们可以将打开文件部门放在一个自定义的函数里:

    def get_coach_data(filename):
        try:
            with open(filename) as fn:
                data=fn.readline()
                temp_data=data.strip().split(',')
                f_data=[sanitize(d) for d in temp_data]
            return (f_data)
        except IOError as ioe:
            print('File Error: '+str(ioe))
            return (None)
    
    james=get_coach_data('./data/james.txt')

    附:列表数据

  • 相关阅读:
    浅谈Lyndon分解
    【CF914G】Sum the Fibonacci(FWT)
    【洛谷6914】[ICPC2015 WF] Tours(非树边随机边权,树边边权异或)
    【洛谷7143】[THUPC2021 初赛] 线段树(动态规划)
    【洛谷7325】[WC2021] 斐波那契(数论)
    【CF666E】Forensic Examination(广义后缀自动机+线段树合并)
    【CF685C】Optimal Point(二分答案)
    【洛谷7364】有标号二分图计数(多项式开根)
    【CF679E】Bear and Bad Powers of 42(ODT+线段树)
    【洛谷5307】[COCI2019] Mobitel(动态规划)
  • 原文地址:https://www.cnblogs.com/hoaprox/p/9598994.html
Copyright © 2020-2023  润新知