前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hand first python 选读(3)

hand first python 选读(3)

作者头像
一粒小麦
发布2019-07-18 16:47:34
3920
发布2019-07-18 16:47:34
举报
文章被收录于专栏:一Li小麦一Li小麦

数据处理

掌握了前面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

显然是后者最优。

列表迭代
代码语言:javascript
复制
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。

代码语言:javascript
复制
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]

代码语言:javascript
复制
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方法去重呢?

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

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

如:

代码语言:javascript
复制
aaa=set()
bbb={1.'2',[1,2]}
# 去重
ccc=set(_ccc)

最后再优化下代码:

代码语言:javascript
复制
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'))

搞定。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一Li小麦 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 排序
  • 列表迭代
  • 列表推导
  • 回到需求:列表去重和截取
  • 改进:集合(set)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档