現在我的手里有了新的一組數據,數據內容如下:
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)
>>> type(palin)
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‘]很好,我們成功的完成了我們想要的功能。
原文:http://blog.csdn.net/wukongcode/article/details/19307635