Python-字典
非空即真,非0即真
# 实现同样的功能,代码越少越牛逼
a = [] b = '' # not的意思是取反 print(not b)# 运行结果为“True” c = () d = 0 e = None if a: print('是真的') else : print('是假的') # 运行结果为“是假的”
0、字典和list的性能上的区别
性能上字典比list取值快,比如找一个值,list需要挨个去寻找,字典是key-value的,可直接根据key去查找。
一、字典 map
字典是比较常用的基本的数据类型之一,字典是无序的
k - v(key - value)
# import this # age name sex addr phone qq email # k - v(key - value) # map name1 = {'name':'name1', 'age':18, 'sex':'unknow', 'addr':'天通苑', 'qq':12345678, 'email':'name1@qq.com', 'age':23 } print(name1) #运行结果:{'email': 'name1@qq.com', 'addr': '天通苑', 'sex': 'unknow', 'qq': 12345678, 'name': 'name1', 'age': 23}
1、增加
(1)第一种增加方式:如果没有就直接添加,如果有,就进行修改
name1['女朋友']='漂亮' print(name1) #运行结果: # {'addr': '天通苑', '女朋友': '漂亮', 'qq': 12345678, 'name': 'name1', 'sex': 'unknow', 'age': 23, 'email': 'name1@qq.com'}
(2)第二种:name1.setdefault()
setdefault()这种方式,如果key已经存在,那么就不会修改。
name1.setdefault('house','10套') print(name1) # 运行结果:{'sex': 'unknow', 'house': '10套', 'email': 'name1@qq.com', 'age': 23, 'addr': '天通苑', 'name': 'name1', '女朋友': '漂亮', 'qq': 12345678}
2、修改
name1['女朋友']='非常漂亮' print(name1) # 运行结果:{'name': 'name1', 'addr': '天通苑', 'email': 'name1@qq.com', 'sex': 'unknow', 'age': 23, 'qq': 12345678, '女朋友': '非常漂亮', 'house': '10套'}
name1.update(a=1,b=2)
往字典里更新值,或者说增加一个key-value
3、删除
(1)name1.pop('女朋友') 指定key删除,删除的时候key不存在是会报错的
name1.pop('女朋友') print(name1) #运行结果:{'age': 23, 'qq': 12345678, 'sex': 'unknow', 'email': 'name1@qq.com', 'addr': '天通苑', 'name': 'name1', 'house': '10套'}
(2)del name1['age'] 用del来删,删除的时候key不存在是会报错的
del name1['女朋友11'] print(name1) #会报错如下 #KeyError: '女朋友11'
(3)清空字典
name1.clear() print(name1) # 运行结果:{}
(4)随机删除一个key
name1.popitem() print(name1) # 运行结果:{'email': 'name1@qq.com', 'addr': '天通苑', 'name': 'name1', 'qq': 12345678, 'sex': 'unknow'}
4、取值
(1)若key存在,可获取到值,若key不存在,则会报错
print(name1['addr']) # 运行结果:天通苑 print(name1['addr111']) # 运行结果:报错如下 # KeyError: 'addr111'
(2)若key存在,可获取到值,若key不存在,则返回设置的返回值。若未设置返回值,则返回none。如下所示
print(name1.get('email','无法获取到email')) # 运行结果:name1@qq.com print(name1.get('emailqqqq','无法获取到email')) # 运行结果:无法获取到email
(3)name1.keys()
print(name1.keys()) 将字典中所有的key取出来,放在一个列表里
(4)
name1.values()
print(name1.values()) 将字典中所有的values取出来,放在一个列表里
(5)判断一个key是否在一个字典里的方法:
示例:
users = { 'fd':'123455', 'xzh':'456789' } username = 'fd' # print(d.keys()) # print(username in users.keys()) # print(username in users) #判断这个key是否存在的 #users.has_key(username) #python2里面的用法
二、把一个字典增加到另外一个字典里
name1.upadate(name2) 将后面的字典加入到前面的字典中,即将name2加入到name1中
name2 = {'computer':'三台'} name1.update(name2)# 把一个字典加入到另外一个字典里面 print(name1) #{'age': 23, 'name': 'name1', 'email': 'name1@qq.com', 'addr': '天通苑', 'sex': 'unknow', 'qq': 12345678, 'computer': '三台'} print(name1.values()) # dict_values([23, 'name1', 'name1@qq.com', '天通苑', 'unknow', 12345678, '三台']) print(name1.keys()) # dict_keys(['age', 'name', 'email', 'addr', 'sex', 'qq', 'computer']) for k,v in name1.items(): print(k,v) # age # 23 # name # name1 # email # name1 @ qq.com # addr # 天通苑 # sex # unknow # qq # 12345678 # computer # 三台
练习:
info = [ { 'xiaohei': { 'money':10000, 'cars':['Ben-z','audi','BMW'], 'info': { 'phone':186212312, 'age':36,} } }, {'xiaohong': { 'house': { '朝阳':2, '海淀':3, '昌平':5 }, 'lan':['ch','en','jp'], } } ] # info[0]['xiaohei']['cars'].append('新车') # print(info) # info[0]['xiaohei']['info']['addr'] = 'sdfsdf' # print(info) info[1]['xiaohong']['house']['海淀']+=2 print(info) # [{'xiaohei': {'cars': ['Ben-z', 'audi', 'BMW'], 'info': {'age': 36, 'phone': 186212312}, 'money': 10000}}, {'xiaohong': {'house': {'朝阳': 2, '海淀': 5, '昌平': 5}, 'lan': ['ch', 'en', 'jp']}}]
三、高效循环字典的方式
d = {'a':1,'b':2} # print(d.items()) # for k,v in d.items(): # print(k,v) #可以 for k in d: print(k,d.get(k)) # 输出结果: # a 1 # b 2
推荐用for k in d的方式,因为第一种方式得先把字典转成二维数组,浪费性能。
print(d.items()) # [('username', 'xiaohei'), ('id', 1), ('grade', '天马座'), ('addr', '北京'), ('age', 18), ('a', 1), ('b', 2)] # for k,v in d.items(): # print(k,v) for k in d: print(k,d.get(k))
为什么for k,v可以取两个值,因为二维数组里刚好都是两个值。
四、字典练习
users = { 'fd':'1234', 'lhy':'456' } for i in range(3): username = input('username:').strip() password = input('password:').strip() cpwd = input('pwd:').strip() if username =='' or password =='' or cpwd == '': print('账号/密码不能为空') elif password != cpwd: print('两次输入的密码不一致') elif username in users: print('账号已经存在') else: users[username] = password print('注册成功!') break else: print('错误次过多') print(users)
先判断不用操作数据库的部分