现在我的手里有了新的一组数据,数据内容如下:
james.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:16julie.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:59mikey.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-31sarah.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我们可以看到数据格式为姓名,出生年月和一系列的时间列表,现在希望的是打印每个文件中的人的姓名、出生年月和最快的三个时间。现在我们先编写一段简单的代码来实现这个功能,代码如下:
"""转换时间格式""" 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) """读取文件内容,并按逗号进行拆分""" def get_coach_data(filename): try: with open(filename) as file: data = file.readline() return(data.strip().split(‘,‘)) except IOError as error: print(‘File Error:‘+str(error)) return(None) """读取sarah.txt的内容""" sarah = get_coach_data(‘sarah.txt‘) "取出姓名和生日" (sarah_name,sarah_birthday) = sarah.pop(0),sarah.pop(0) """打印姓名、生日和最快的三个时间""" print(sarah_name+"的生日是:"+sarah_birthday+",最快的三个时间是:"+str(sorted(set([sanitize(t) for t in sarah]))[0:3]))这段代码非常的简单,只是将前两篇文章中的内容整合到了一起,如果不是很熟悉的话可以参看【python实战】的前面两篇文章。运行效果如下:
>>> ================================ RESTART ================================ >>> Sarah Sweeney的生日是:2002-6-17,最快的三个时间是:[‘2.18‘, ‘2.21‘, ‘2.22‘]这里我们只是通过自己编码实现了我们想要的功能,但是我们回过头看下我们编写的代码,可以看到,代码似乎有些不太合理,我们只是读取sarah的内容就定义了三个变量,如果再加上其他三个人的话就有12个变量了,如果要是有40、400、4000个人呢?所以这里我们就要使用一个数据字典的功能。
关于数据字典我们下面举几个例子,如下:
1、创建两个字典,一个用大括号创建,另一个用工厂创建
>>> clesse={} >>> palin=dict() >>> >>> type(clesse) <class ‘dict‘> >>> type(palin) <class ‘dict‘>2、通过键值关联,分别向这两个字典中增加一些数据
>>> clesse[‘name‘] = ‘zhangsan‘ >>> clesse[‘birthday‘] = ‘2002-06-12‘ >>> palin = {‘name‘:‘wangwu‘,‘occupations‘:[‘comedian‘,‘actor‘,‘writer‘,‘tv‘]}3、键与值关联之后,我们就可以通过键进行值的调用了,如下:
>>> clesse[‘name‘] ‘zhangsan‘ >>> palin[‘occupations‘][-1] ‘tv‘4、可以显示字典全部内容:
>>> clesse {‘name‘: ‘zhangsan‘, ‘birthday‘: ‘2002-06-12‘} >>> palin {‘occupations‘: [‘comedian‘, ‘actor‘, ‘writer‘, ‘tv‘], ‘name‘: ‘wangwu‘}通过上面的例子,我们可以了解到数据字典其实就是键值的对应,了解了数据字典之后,我们能不能使用数据字典来修改之前的代码呢?先让我们来尝试一下吧:
"""转换时间格式""" 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) """读取文件内容,并按逗号进行拆分""" def get_coach_data(filename): try: with open(filename) as file: data = file.readline() return(data.strip().split(‘,‘)) except IOError as error: print(‘File Error:‘+str(error)) return(None) """读取sarah.txt的内容""" sarah = get_coach_data(‘sarah.txt‘) "定义sarah数据字典" sarah_data={} "向sarah数据字典中存入内容" sarah_data[‘name‘]=sarah.pop(0) sarah_data[‘birthday‘]=sarah.pop(0) sarah_data[‘time‘]=sarah """打印姓名、生日和最快的三个时间""" print(sarah_data[‘name‘]+"的生日是:"+sarah_data[‘birthday‘]+",最快的三个时间是:"+str(sorted(set([sanitize(t) for t in sarah_data[‘time‘]]))[0:3]))我们修改原先的代码,将之前的变量定义转换成了现在的数据字典,通过数据字典进行数据的操作,现在我们运行,查看结果:
>>> ================================ RESTART ================================ >>> Sarah Sweeney的生日是:2002-6-17,最快的三个时间是:[‘2.18‘, ‘2.21‘, ‘2.22‘]结果和之前也是一样的,现在我们继续修改代码,以适应多个文件的读取和内容的操作,代码如下:
"""转换时间格式""" 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) """读取文件内容,并按逗号进行拆分""" def get_coach_data(filename): try: with open(filename) as file: data = file.readline() temp=data.strip().split(‘,‘) return({‘name‘:temp.pop(0),‘birthday‘:temp.pop(0),‘time‘:str(sorted(set([sanitize(t) for t in temp]))[0:3])}) except IOError as error: print(‘File Error:‘+str(error)) return(None) """读取文件的内容""" james = get_coach_data(‘james.txt‘) julie = get_coach_data(‘julie.txt‘) mikey = get_coach_data(‘mikey.txt‘) sarah = get_coach_data(‘sarah.txt‘) """打印姓名、生日和最快的三个时间""" print(james[‘name‘]+"的生日是:"+james[‘birthday‘]+",最快的三个时间是:"+james[‘time‘]) print(julie[‘name‘]+"的生日是:"+julie[‘birthday‘]+",最快的三个时间是:"+julie[‘time‘]) print(mikey[‘name‘]+"的生日是:"+mikey[‘birthday‘]+",最快的三个时间是:"+mikey[‘time‘]) print(sarah[‘name‘]+"的生日是:"+sarah[‘birthday‘]+",最快的三个时间是:"+sarah[‘time‘])这里我们修改了get_coach_data函数,让其直接返回一个数据字典,这样就会很方便了,运行结果如下:
>>> ================================ RESTART ================================ >>> James Lee的生日是:2002-3-14,最快的三个时间是:[‘2.01‘, ‘2.16‘, ‘2.22‘] Julie Jones的生日是:2002-8-17,最快的三个时间是:[‘2.11‘, ‘2.23‘, ‘2.59‘] Mikey McManus的生日是:2002-2-24,最快的三个时间是:[‘2.22‘, ‘2.31‘, ‘2.38‘] Sarah Sweeney的生日是:2002-6-17,最快的三个时间是:[‘2.18‘, ‘2.21‘, ‘2.22‘]很好,我们成功的完成了我们想要的功能。