数据处理
掌握了前面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]
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'))
搞定。