为什么需要字典类型:
字典是python中唯一的映射类型,key-value(哈希表hash),字典对象是可变的,但key必须用不可变对象
字典的创建(3种方法)
前面的称为键:key,后面的称为值:value。统称为键值对:key-value
(1)
d = dict(a=1,b=2)
(2)
d = {a:1,b:2}
(3)
d = {}.fromkeys(["user1","user2"],"dream")
eg.
info = {
'root':{
'name':'root',
'passwd':'dream',
'age':18,
'email':['23456@qq.com','redhat@126.com']
},
'student':{
'name':'student',
'passwd':'redhat',
'age':22,
'email':['123456@qq.com','redhat@126.com']
},
}
print info['student']
字典值的访问
直接通过key访问:
d = {"a":1,"b":2,"c":3,"d":4}
print d["a"]
结果:
1
循环遍历访问:
d = {"a":1,"b":2,"c":3,"d":4}
for key in d:
print d[key]
结果:
1
3
2
4
字典特性
不可行:索引,切片,连接,重复(因为字典是无序的数据类型)
可行的特性:成员操作符(返回一个布尔值)
字典的增加
update:
在增加的时候如果key存在,更新对应的value值
d={"a":1,"b":2}
d.update(a=2,c=3)
print d
结果:
{'a': 2, 'b': 2, 'c': 3}
setdefault:
如果存在不操作,如果不存在添加key-value值,只能添加单个
d={"a":1,"b":2}
d.setdefault("a",2)
print d
{'a': 1, 'b': 2}
字典的查看
d={"a":1,"b":2}
for i,j in d.items():
print i,j
结果:
a 1
b 2
字典的删除
dict.pop(key):根据key值删除字典的元素,不输入key值会报错
如果key不存在,判断d是否存在:
如果d不存在就报错KeyError
如果d存在,就删除d对应的值
d={"a":1,"b":2,"c":3,"d":4}
d.pop("a")
print d
结果:
{'b': 2, 'c': 3, 'd': 4}
dict.popitem( ):随机删除字典元素,返回(key,value)
d={"a":1,"b":2,"c":3,"d":4}
d.popitem()
Out[100]: ('a', 1)
d.popitem()
Out[101]: ('c', 3)
dict.clear( ):删除字典中的所有元素
d={"a":1,"b":2,"c":3,"d":4}
d.clear()
print d
结果:
{}
del dict:删除字典本身
d={"a":1,"b":2,"c":3,"d":4}
del d
print d
结果:
NameError: name 'd' is not defined
字典的常用方法
dict.get( ):如果key存在于字典中,返回对应value值,不存在返回空
d = {"a":1,"b":2,"c":3,"d":4}
d.get("a")
结果:
1
dict.keys( ):返回字典的所有key值
d = {"a":1,"b":2,"c":3,"d":4}
print d.keys()
['a', 'c', 'b', 'd']
dict.has_keys( ):字典中是否存在某个key值
d = {"a":1,"b":2,"c":3,"d":4}
print d.has_key("a")
结果:
True
print d.has_key("e")
结果:
False
练习
1.字符串最后一个单词的长度
题目描述:计算字符串最后一个单词的长度,单词以空格隔开。
输入描述: 一行字符串,非空,长度小于5000。
输出描述: 整数N,最后一个单词的长度。
示例1:
输入:hello world
输出:5
str = raw_input("please input string:")
if not str:
print "请输入字符!!!"
else:
if len(str) > 5000:
print "The max length is 5000!!!"
else:
if str[-1]==" ":
print "最后不能为空!!!"
else:
print len(str.split()[-1])
2. 计算字符个数
题目描述: 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
输入描述: 输入一个有字母和数字以及空格组成的字符串,和一个字符。
输出描述:输出输入字符串中含有该字符的个数。
示例1:
输入:ABCDEF A
输出:1
string = raw_input("please input string:")
count = 0
if len(string.split()[-1]) != 1:
print "Error!!!"
exit()
for i in string.split()[0]:
if i == string.split()[-1]:
count += 1
print "含有该字符的个数为:%d" %count
3. 简单密码破解
题目描述:密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。
假设渊子原来一个BBS上的密码为zvbo9441987,为了方便记忆,他通过一种算法把这个密码变换成YUANzhi1987,这个密码是他的名字和出生年份,怎么忘都忘不了,而且可以明目张胆地放在显眼的地方而不被别人知道真正的密码。
他是这么变换的,大家都知道手机上的字母: 1–1, abc–2, def–3, ghi–4, jkl–5, mno–6, pqrs–7, tuv–8 wxyz–9, 0–0,就这么简单,渊子把密码中出现的小写字母都变成对应的数字,数字和其他的符号都不做变换,
声明:密码中没有空格,而密码中出现的大写字母则变成小写之后往后移一位,如:X,先变成小写,再往后移一位,不就是y了嘛,简单吧。记住,z往后移是a哦。
输入描述:输入包括多个测试数据。输入是一个明文,密码长度不超过100个字符,输入直到文件结尾;
输出描述:输出渊子真正的密文
示例1:
输入:YUANzhi1987
输出:zvbo9441987
li = []
string = raw_input("please input passwd:")
for i in string:
if i.islower():
if i in "abc":
li.append("2")
elif i in "def":
li.append("3")
elif i in "ghi":
li.append("4")
elif i in "jkl":
li.append("5")
elif i in "mno":
li.append("6")
elif i in "pqrs":
li.append("7")
elif i in "tuv":
li.append("8")
else:
li.append("9")
elif i.isupper():
if i == "Z":
li.append("a")
else:
li.append(chr(ord(i) + 33))
else:
li.append(i)
print "".join(li)
4. (2017-腾讯-在线编程题)
- 题目描述:
给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
如,输入为10, 程序应该输出结果为2。(共有两对质数的和为10,分别为(5,5),(3,7))
- 输入描述:
输入包括一个整数n,(3 ≤ n < 1000)
- 输出描述:
-输出对数
- 示例1 :
输入:
10
输出:
2
Num = input("please input Num: ") + 1
li = []
pair_li = []
def isPrime(Num):
for i in range(2, Num):
if Num % i == 0:
return False
else:
return True
[li.append(i) for i in range(2, Num) if isPrime(i)]
for i in li:
for j in li:
if i + j == Num - 1 and i <= j:
pair_li.append((i, j))
print "结果为:%d" % len(pair_li)
5.ATM程序
info = """ ATM柜员机管理系统
1.取款 4.查询余额
2.存款 5.修改密码
3.转账 6.退出
"""
d = {
123: {
"card": 123,
"passwd": 123,
"money": 666
}
}
Times = 0
while 1:
Card = input("请输入卡号:")
Passwd = input("请输入密码:")
if Card in d and Passwd == d[Card]["passwd"]:
while 1:
print info
choice = raw_input("please input your action:")
if choice == "1":
while 1:
a = input("请输入取款金额:")
if d[Card]["money"] >= a:
print "取款成功"
a1 = d[Card]["money"] - a
d[Card].update(money=a1)
break
else:
print "余额不足!!!"
break
elif choice == "2":
b = input("请输入存款金额:")
b1 = d[Card]["money"] + b
d[Card].update(money=b1)
print "¥%d已存入,总余额为:%d" % (b, b1)
elif choice == "3":
d4 = input("请输入转账帐号:")
if d4 == Card:
print "请输入其他帐号!!!"
else:
while 1:
d1 = input("请输入转账金额:")
d2 = input("请输入密码:")
if d2 == d[Card]["passwd"]:
if d[Card]["money"] >= d1:
Times = 0
d3 = d[Card]["money"] - d1
d[Card].update(money=d3)
print "转账成功,你的余额为:%d" % (d3)
break
else:
print "余额不足!!!"
break
else:
Times += 1
if Times == 3:
print "卡已冻结!!!"
exit()
print "密码输入有误!!!"
elif choice == "4":
print "你的余额为:¥%d" % (d[Card]["money"])
elif choice == "5":
c = input("请输入原密码:")
if c == d[Card]["passwd"]:
Times = 0
while 1:
c1 = input("请输入新密码:")
c2 = input("请再次输入:")
if c1 == c2:
print "密码修改成功!!!"
d[Card].update(passwd=c2)
break
else:
print "密码输入不一致,请重新输入!!!"
else:
print "密码输入有误!!!"
Times += 1
if Times == 3:
print "卡已冻结!!!"
exit()
continue
elif choice == "6":
print "请拔出银行卡!!!"
exit()
else:
print "输入有误,请重新输入!!!"
else:
print "卡号或密码输入有误!!!"
Times += 1
if Times == 3:
print "卡已冻结!!!"
exit()
continue