hand first python 选读(3)

2019-07-18 16:47:34 浏览数 (1)

数据处理

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

搞定。

0 人点赞