《Python核心编程》第七章练习解析

第七章

 

第一题:

字典方法。哪些字典方法能够把两个字典合并到一块儿?java

答:dict.update(dict2)     字典dict2的键-值对添加到dictnode

第二题:

python

第三题:

字典和列表的方法。web

(a) 建一个字典,并把字典中的键按照字母顺序显示出来。算法

(b) 在根据排好的键,显示出这个字典的键和值。app

(c)此次按照值排序输出。dom


(a)函数

#-*- coding:utf-8 -*-
#2015-03-31

mydict = {'a':1,'c':3,'b':2}
print sorted(mydict)

(b)网站

#-*- coding:utf-8 -*-
#2015-03-31

mydict = {'a':1,'c':3,'b':2}
sort_key = sorted(mydict)
for i in sort_key:
    print "%s:%d" % (i,mydict[i])

(c)加密

#-*- coding:utf-8 -*-
#2015-03-31

mydict = {'a':1,'c':3,'b':2}
sort_key = sorted(mydict)
for i,j in sorted(mydict.items(),key=lambda value:value[1]):
    print "%s:%d" % (i,j)

#(c)参考http://space.wudiweb.com/phychion/blog/94

第四题:

创建字典。给定两个长度相同的列表,例如 [1,2,3......], ['abc','def','ghi'.....] ,利用这两个列表的数据创建一个字典,像这样:{1:'abc',2:'def',3:'ghi'......]。

#-*- coding:utf-8 -*-
#2015-03-31

list1 = [1,2,3,4]
list2 = ['a','b','c','d']
mydict = {}

for i in range(len(list1)):
    mydict.setdefault(list1[i],list2[i])
    
print mydict

第五题:

userpw2.py。下面的问题和例题7.1中的管理名字-密码的键值对数据程序有关。

(a) 修改那个脚本,使他能记录用户上次的登录日期和时间(用time模块),并与用户密码一块儿保存起来。程序的界面要求用户输入用户名和密码的提示。不管用户名是否登录成功,都应有提示,在用户登录成功后,应更新相应用户的上次登录时间戳。若是本次登录与上次登录在时间上相差不超过四个小时,则通知该用户:“You already in at :<last_login_timestamp>”。

(b) 添加一个管理菜单,其中有如下两项:(1)删除一个用户 (2)显示系统中全部用户的名字和他们密码的清单。

(c) 口令目前没有加密。请添加一段对口令加密的代码

(d) 为程序添加图形界面,例如,用Tkinter。

(e) 要求用户名布区分大小写。

(f ) 增强对用户名的限制,不容许符号和空白符。

(g) 合并“新用户”和“老用户”两个选项。若是一个新用户试图用一个不存在的用户名登录,询问该用户是不是新用户,若是是确定的,就建立该用户。不然按老用户的方式登录。


此题单独列出:http://blog.csdn.net/guojuxia/article/details/44886957

第六题:

列表和字典。建立一个简单的股票证券投资数据系统。其中应至少包括4项数据:股市行情显示器符号、所持有的股票、购买价格及当前价位----你能够添加其余数据项,好比收益率,52周最高指数、最低指数,等等。

用户每次输入各列的数据构成一个输出行。每行数据构成一个列表。还有一个总列表,包括了全部行的数据。数据输入完毕后,提示用户选择一列数据项进行排序。把该数据项抽取数来做为字典的键,字典的值就是该键对应行的值得列表。提醒读者:被选择用来排序的数据项必须是非重复的键,不然就会丢失数据,由于字典不容许一个键有多个值。

你还能够选择其余计算输出,好比盈亏比率、目前证券资产价值等。

因为本人对股票一窍不通,因此将问题抽象化,只作对字典键排序的那部分,程序以下:

#-*- coding:utf-8 -*-
#2015-04-05

def sort_db(db):
    temp = {}
    dict_db = {}
    key = raw_input('How to sort list:id、phone? ')
    if key == 'id':
        for line in db:
            temp.setdefault(line[0],line)
    else:
        for line in db:
            temp.setdefault(line[2],line)
    db2 = sorted(temp.iteritems(),key=lambda d:d[0])
    for i in db2:
        print i[0],i[1]
        dict_db.setdefault(i[0],i[1])
    print '\n'

if __name__ == '__main__':
    db = []
    print 'Please input id,name,phone'
    while True:
        line = raw_input()
        if len(line)==1 and int(line)==0:
            break
        date = line.split()
        db.append(date)
    sort_db(db)
运行结果

Please input id,name,phone
1 admin 123
3 zxcvb 456
2 qwert 789
0
How to sort list:id、phone? id
1 ['1', 'admin', '123']
2 ['2', 'qwert', '789']
3 ['3', 'zxcvb', '456']



第七题:

颠倒字典中的键和值。用一个字典作输入,输出另外一个字典,用前者的键作值,前者的值作键。

#-*- coding:utf-8 -*-
#2015-04-05

dict_test1 = {1:'a',2:'b',3:'c'}
dict_test2 = {}
for key in dict_test1:
    dict_test2.setdefault(dict_test1[key],key)
    
print dict_test2

第八题:

 人力资源。建立一个简单的雇员姓名和编号的程序,让用户输入一组雇员姓名和编号。你的程序能够提供按照姓名排序输出的功能,雇员姓名显示在前,后面是对应的雇员编号。附加题:添加一项功能,按照雇员编号的顺序输出数据。

注:本题与第六题代码基本一致,稍加修改便可。


第九题:

翻译。

(a) 编写一个字符串翻译程序(功能相似于Unix中的tr命令)。咱们将这个函数叫作tr(),他有三个字符串参数:源字符串、目的字符串、基本字符串,语法定义以下:

def tr(srcstr,dststr,string)
srcstr 的内容是你打算“翻译”的字符集合,dsrtr是翻译后获得的字符集合,而string是你打算翻译操做的字符串。举例来讲,若是srcstr=='abc',dststr=='mno',string=='abcdef',那么tr()的输出将是‘mnodef’。注意这里len(srcstr)==len(dststr)。在这个练习里你可使用内建函数chr()和ord(),但他们并不必定时解决这个问题所必不可少的函数。

(b) 在这个函数里增长一个标志参数,来处理不区分大小写的翻译问题。

(c) 修改你的程序,使他们可以处理删除字符的操做。字符串srcstr中不可以映射到字符串dststr中字符的多余字符都将被过滤掉。换句话说,这些字符没有映射到dststr字符串中的任何字符,所以就从函数返回的字符串里被过滤掉了。举例来讲:若是srcstr=='abcdef',dststr=='mno',string=='abcdefghi',那么tr()将输出'mnoghi'。注意这里len(srcstr)>=len(dststr)。


#-*- coding:utf-8 -*-
#2015-04-05

def tr(srcstr,dststr,mystring,flag=True):
    src_dst = {}
    newstring = ''
    if len(srcstr)==len(dststr): 
        '''(a)和(b)的前两问'''
        if flag:
            for key,value in zip(srcstr,dststr):
                src_dst.setdefault(key,value)
            for i in mystring:
                if i in src_dst:
                    newstring += src_dst[i]
                else:
                    newstring += i
        else:
            for key,value in zip(srcstr.lower(),dststr):
                src_dst.setdefault(key,value)
            for i in mystring:
                if i.lower() in src_dst:
                    newstring += src_dst[i.lower()]
                else:
                    newstring += i
    else:
        '''(c)删除字符的功能'''
        if flag:
            for key,value in zip(srcstr[:len(dststr)],dststr):
                src_dst.setdefault(key,value)
            for i in mystring:
                if i in src_dst:
                    newstring += src_dst[i]
                elif i not in srcstr:
                    newstring += i
        else:
            for key,value in zip(srcstr.lower()[:len(dststr)],dststr):
                src_dst.setdefault(key,value)
            for i in mystring:
                if i.lower() in src_dst:
                    newstring += src_dst[i.lower()]
                elif i not in srcstr:
                    newstring += i
    return newstring
    
if __name__ == '__main__':
    srcstr = raw_input('Please input srcstr:')
    dststr = raw_input('Please input dststr:')
    mystring = raw_input('Please input the string:')
    flag = input('Lower or uppper,input True or False:')  #是否区分大小写的参数
    newstring = tr(srcstr, dststr, mystring, flag)
    print newstring

运行结果

Please input srcstr:abcdef
Please input dststr:mno
Please input the string:abcdefghi
Lower or uppper,input True or False:True
mnoghi


第十题:

加密。

(a) 用上一个练习的思路编写一个”rot13“翻译器。”rot13“是一个古老而又简单的加密算法,它把字母表中的每一个字母用其后的第13个字母代替。字母表中前半部分将被映像到后半部分,然后半部分将被映像到前半部分,大小写不变。举例来讲,’a‘将被替换为'n',’X‘将被替换为'K';数字和符号不进行翻译。

(b) 在你的解决方案的基础上加上一个应用程序,让他提示用户输入准备加密的字符串(这个算法同时也能够对加密后的字符串进行解密)。

#-*- coding:utf-8 -*-
#2015-04-06

db = {'a':'n','b':'o','c':'p','d':'q','e':'r','f':'s','g':'t','h':'u','i':'v','j':'w','k':'x','l':'y','m':'z',
     'n':'a','o':'b','p':'c','q':'d','r':'e','s':'f','t':'g','u':'h','v':'i','w':'j','x':'k','y':'l','z':'m',
     'N':'A','O':'B','P':'C','Q':'D','R':'E','S':'F','T':'G','U':'H','V':'I','W':'J','X':'K','Y':'L','Z':'M',
     'A':'N','B':'O','C':'P','D':'Q','E':'R','F':'S','G':'T','H':'U','I':'V','J':'W','K':'X','L':'Y','M':'Z'}

def code_rot13(mystring):
    newstring = ''
    for c in mystring:
        if c in db:
            newstring += db[c]
        else:
            newstring += c 
    return newstring

if __name__ == '__main__':
    mystring = raw_input('Enter string to rot13:')
    newstring = code_rot13(mystring)
    print newstring

这中加密方式与解密自己是同样的,对加密程序再加一次密就是解密了,因此只用一个函数就行了。

这里再发一个rot13加解密的网站:http://www.mxcz.net/tools/rot13.aspx

第十一题:

定义。什么组成字典中合法的键?举例说明字典中合法的键与非法的键。

答:

键必须是可哈希的!全部不可变类型都是可哈希的,因此他们均可做为字典的键!

举例:数字1是不可变对象,可做为字典的键;列表{1,2}不可做为字典的键,由于列表是可变的。

第十二题:

定义。

(a) 在数学上,什么是集合?

(b) 在Python中,关于集合类型的定义什么?

答:

(a) 集合是指具备某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素

(b) 在Python中,集合对象是一组无序列的可哈希的值。

第十三题:

随机数。修改练习5-7的代码,用random中的randint()或者randrange()生成一个随机数集合,从0-9(包括9)中随机选择1到10个随机数,而后组成一个集合A,同理生成B,而后显示A|B 和 A&B。

#-*- coding:utf-8 -*-
#2015-04-06

import random

Aset = set()
Bset = set()
temp = random.randint(1,10)
for i in range(temp):
    Aset.add(random.randint(0,9))
temp = random.randint(1,10)
for i in range(temp):
    Bset.add(random.randint(0,9))
    
    
print Aset | Bset
print Aset & Bset


第十四题:

用户验证。修改前面的练习,要求用户输入A|B和A&B的结果,并告诉用户他(或她)的答案是否正确,而不是将A|B和A&B的结果直接显示出来。若是用户回答错误,若是用户回答错误,容许修改,而后从新输入用户输入的答案。若是用户提交三次的答案均不正确,程序将显示正确的结果。附加题:运用你关于集合的知识,建立某个集合潜在的子集,并询问用户此潜在的子集是不是真是该集合的子集,要求和主程序同样有显示更正和答案的功能。
#-*- coding:utf-8 -*-
#2015-04-06

import random

def set_random():
    Aset = set()
    Bset = set()
    temp = random.randint(1,10)
    for i in range(temp):
        Aset.add(random.randint(0,9))
    temp = random.randint(1,10)
    for i in range(temp):
        Bset.add(random.randint(0,9))
    print 'Aset is:',Aset
    print 'Bset is:',Bset
    return (Aset,Bset)

def set_check(Aset,Bset):
    for i in range(3):
        Cset = set(map(int,raw_input('Please input A|B:').split()))
        Dset = set(map(int,raw_input('Please input A&B:').split()))
        if Aset|Bset==Cset and Aset&Bset==Dset:
            print 'Accepted!'
            break
        else:
            print 'Wrong answer!'
    else:
        print 'Aset|Bset is:',Aset|Bset 
        print 'Bset&Bset is:',Aset&Bset

if __name__ == '__main__':
    myset = set_random()
    set_check(myset[0], myset[1])


第十五题:

#-*- coding:utf-8 -*-
#2015-04-06

def C_set():
    Aset = set(raw_input('Please input A set:').split())
    Bset = set(raw_input('Please input B set:').split())
    op = raw_input('Please input Operator:')
    if op=='in':
        print Aset in Bset
    elif op=='not in':
        print Aset not in Bset
    elif op=='&':
        print Aset & Bset
    elif op==r'|':
        print Aset | Bset
    elif op=='<':
        print Aset<Bset
    elif op=='>':
        print Aset>Bset
    elif op=='=':
        print Aset==Bset
    elif op=='!=':
        print Aset!=Bset
        
if __name__=='__main__':
    C_set()