专栏首页一Li小麦hand first python 选读(3)

hand first python 选读(3)

数据处理

掌握了前面4章,这就是比较简单的一章。

先看一个需求:

有一个跑步教练kelly,他最好的选手一直在刻苦训练,每次跑步成绩,kelly都会及时的把事件记录在计算机的一个文本文件中。总共有四个文件,分别记录james,sarah,julie和mikey的时间数据。 james:2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22 julie:2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21 sarah:2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55 mikey:2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38 首先,这个教练需要一种快捷的方法能够很快了解每个选手跑得最快的3个时间

分析数据,有的是以 .连接,有些以 -连接,还有的是 :。需作分类讨论转化为小数。

排序

接下来介绍列表排序方法。

  • sort:用法如arr.sort(),不会返回新的列表,且修改原有列表
  • sorted:用法如sorted(arr);返回一个新数组,不修改旧列表

都是升序排列。如需要降序,需要加入参数 reverse=True

显然是后者最优。

列表迭代

def getFast(fileName):
    arr = []
    with open(fileName) as data:
        for line in data: 
            scores = line.split(',')
            for score in scores:          
                arr.append(sanitize(score))    
        data.close()
    return sorted(arr)


def sanitize(score):
    splitter = '.'
    if '-' in score:
        splitter = '-'
    if ':' in score:
        splitter = ':'
    elif '.' in splitter:
        return score
    (mins, sec) = score.split(splitter)
    return mins+'.'+sec


print(getFast('mikey.txt'))

列表推导

这里使用原来所学得到的方案。在getFast中,会然后追加一个新的列表。这种语法比较low。

def getFast(fileName):
    arr = []
    with open(fileName) as data:
        line=data.readline()
        scores = line.split(',')
        arr = [sanitize(score) for score in scores] 
        data.close()
    return sorted(arr)

是谓之一行搞定,得之简洁,失之灵活

回到需求:列表去重和截取

需求是:获取每个选手的 前三个快的数据

首先要明确去重的判断是 ifnotxxx。。。

其次,列表截取前三个的方法是 arrery[x:y]

def getFast(fileName):
    arr = []
    with open(fileName) as data:
        line=data.readline()
        scores = line.split(',')
        arr = [sanitize(score) for score in scores] 
        _arr=[]
        for item in arr:
            if not item in _arr:
                _arr.append(item)
        data.close()
    return sorted(_arr)[0:3]

计划通。

改进:集合(set)

列表去重的问题引发另一个思考:有没有另外一个BIF方法去重呢?

是时候介绍另外一个数据结构了——集合。

集合与数学上的集合差不多,啥数据都能放,除了重复

如:

aaa=set()
bbb={1.'2',[1,2]}
# 去重
ccc=set(_ccc)

最后再优化下代码:

def sanitize(score):
    splitter = '.'
    if '-' in score:
        splitter = '-'
    if ':' in score:
        splitter = ':'
    elif '.' in splitter:
        return score
    (mins, sec) = score.split(splitter)
    return mins+'.'+sec

def getFast(fileName):
    arr = []
    try:
        with open(fileName) as data:
            line=data.readline()
            scores = line.split(',')
            arr = [sanitize(score) for score in scores] 
            _arr=set(arr)
        return sorted(_arr)[0:3]
    except IOError as err:
         print('file error.'+str(err))

print(getFast('mikey.txt'))

搞定。

本文分享自微信公众号 - 一Li小麦(gh_c88159ec1309),作者:一li小麦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • head first python选读(4):web 开发

    这个app.py是所有文件的入口。因此所有的文件都依靠这个文件进行交互。路径以根目录为主。

    一粒小麦
  • 前端常见排序方式及其性能比较

    实验方法:随机生成1000条(0-999)整数数据。分别对其在不同数据量进行排序10次。统计平均时间。

    一粒小麦
  • 爬虫爬取豆瓣电影top250

    我想,爬虫对很多人来说是一个很有魅力的话题,它意味着不用什么努力就拿到了别人辛苦付出的的劳动成果。

    一粒小麦
  • R语言构建层次分析模型不看一下吗~

    AHP (Analytic Hierarchy Process)层次分析法是美国运筹学家Saaty教授于二十世纪80年代提出的一种实用的多方案或多目标的决策方法...

    数据小磨坊
  • java如何获得数据库表中字段等相关的信息

    gfu
  • 使用@property

    http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a0...

    bear_fish
  • “猜你喜欢”的背后揭秘——我偷偷知道你喜欢什么哟

    话说,最近的瓜实在有点多,从我科校友李雨桐怒锤某男、陈羽凡吸毒被捕、蒋劲夫家暴的三连瓜,到不知知网翟博士,再到邓紫棋解约蜂鸟、王思聪花千芳隔空互怼。

    用户1621951
  • 学习小组Day5笔记--liull

    今天就把花花的教程看完了,ggplot2还在学习中,先占个坑先,上今天的思维导图哟

    liu_ll
  • python 面向对象技巧 @property

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:

    葫芦
  • java如何获得数据库表中各字段的字段名

    ydymz

扫码关注云+社区

领取腾讯云代金券