背景介绍:
对混合型记录数据如:[James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22,2-01,2.01,2:16]进行数据分解,第一部分字母为姓名,第二部分为出生时间,第三部分为800m长跑的时间记录,但是对于计时部分,数据不一致,用了“-”和“.”和“:”三种符号来分割分钟和秒,因此需要做以下工作:
1,数据分解,将同类型数据归类
2,统一时间数据的格式为 分.秒 记录方式
3,去除重复的时间记录,并返回最快的前三个时间
数据:
james2.txt=[James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22,2-01,2.01,2:16]
julie2.txt=[Julie Jones,2002-8-17,2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21,3.01,3.02,2:59]
mikey2.txt=[Mikey McManus,2002-2-24,2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38,2:40,2.22,2-31]
sarah2.txt=[Sarah Sweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55,2:22,2-21,2.22]
运行环境:Python 3.4.0 (default, Apr 11 2014, 13:05:11)
[GCC 4.8.2] on linux
Type "copyright", "credits" or "license()" for more information.
代码:
'''定义一个函数sanitize(),将原始数据的分号和冒号都换成点号,实现数据的一致性'''
def sanitize(time_string):
if '-' in time_string:
splitter = '-'
elif ':' in time_string:
splitter = ':'
else:
return(time_string)
(mins,secs) = time_string.split(splitter)
return(mins+'.'+secs)
'''定义一个类Athlete,实现数据初始化和排序取前三'''
class Athlete:
def __init__(self,a_name,a_dob=None,a_times=[]):
self.name = a_name
self.dob = a_dob
self.times = a_times
def top3(self):
return(sorted(set([sanitize(t) for t in self.times]))[0:3])
def get_coach_data(filename):
try:
with open(filename) as f:
data = f.readline()
tmp = data.strip().split(',')
return(Athlete(tmp.pop(0),tmp.pop(0),tmp))
except IOError as err:
print('File Error:'+str(err))
return(None)
james=get_coach_data('james2.txt')
julie = get_coach_data('julie2.txt')
mikey = get_coach_data('mikey2.txt')
sarah = get_coach_data('sarah2.txt')
'''打印名字和最快的三个时间'''
print(james.name + "'s fastest times are: "+ str(james.top3()))
print(julie.name + "'s fastest times are: "+ str(julie.top3()))
print(mikey.name + "'s fastest times are: "+ str(mikey.top3()))
print(sarah.name + "'s fastest times are: "+ str(sarah.top3()))
运行结果:
注意事项:
1,在定义类时,注意def行中的冒号,另外在初始化函数(在python中时没有构造函数一说的)__init__()时,init的前后是两条下划线!
2,类中定义无传入参数函数时也要带上self参数,self参数非常重要。
3,tmp = data.strip().split(',')
属于方法串链,从左向右进行;sorted(set([sanitize(t) for t in self.times]))
属于函数串链,从右向左进行。4,print(james.name + "'s fastest times are: "+ str(james.top3())),中的str()将参数内容强制转化成统一的字符串以便输出,不然会出现不能将列表转化为字符串的错误,因为前两个都是字母组成的字符串,而最后一个时数字组成的数据,要统一成字符串,因此加str()强制转化。
5, return(Athlete(tmp.pop(0),tmp.pop(0),tmp)) 中用pop(0)函数,第一次弹出最前面一项数据,弹出后就将其删除,下一项数据自然成为第一项。
6,代码中用到的函数解释:
split():按某个符号将字符串分解成几部分,如按逗号将[gend,lee,is,666]分解成四部分:split(',',3);
strip():去掉每一行的空白符,一般不带参数;
set():创建一个集合,自动忽略重复的内容,但创建的元素无序排列(也就是集合的特性:唯一性,无序性);
sorted():对一个字符串进行排序(默认升序,要降序则在sorted()参数中添加reverse=True),排序后的字符串赋给另个副本,不覆盖原始字符串;
扩展:sort()进行原地排序,覆盖原来字符串内容;
取表中的前三项用:table[0:3],也就是table[0],table[1],table[2],不会包含3,python中的范围取左闭右开区间,如range(4)=0,1,2,3不含4。
补充:类的继承
如果利用继承类list,则相应部分代码为:
class AthleteList(list):
def __init__(self,a_name,a_dob=None,a_times=[]):
list.__init__([])
self.name = a_name
self.dob = a_dob
self.extend(a_times)
def top3(self):
return(sorted(set([sanitize(t) for t in self]))[0:3])
相应的get_coach_data()函数中的返回修改为:
return(AthleteList(tmp.pop(0),tmp.pop(0),tmp))
文章来源:《HeadFirstPython》,仅供学习参考。转载请注明文章出处:
http://blog.csdn.net/gendlee1991/article/details/51412676