【Python实战12】使用字典关联数据

现在我的手里有了新的一组数据,数据内容如下:

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:16
julie.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
mikey.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
sarah.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‘]
很好,我们成功的完成了我们想要的功能。








【Python实战12】使用字典关联数据,布布扣,bubuko.com

【Python实战12】使用字典关联数据

上一篇:C++编程规范之48:在构造函数中使用初始化代替赋值


下一篇:排列算法 C++实现