第七章
第一题:
字典方法。哪些字典方法可以把两个字典合并到一起?
答:dict.update(dict2) 字典dict2的键-值对添加到dict
第二题:
略
第三题:
字典和列表的方法。
(a) 建一个字典,并把字典中的键按照字母顺序显示出来。
(b) 在根据排好的键,显示出这个字典的键和值。
(c)这次按照值排序输出。
(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
第十四题:
#-*- 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()