代码中列出一些dict基本操作
#创建字典
#直接创建,如
dicta={"name":'hilary','age':21,'address':'chengdu'}
for x in range(7):
dicta[chr(x+ord('A'))]=x
print(dicta) # {'name': 'hilary', 'age': 21, 'address': 'chengdu', 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6}
#dict.fromkeys(seq[, val]))
#创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值
tuplea=('H','I','L','A','R','Y')
dicta=dict.fromkeys(tuplea,0)
print(dicta) # {'H': 0, 'I': 0, 'L': 0, 'A': 0, 'R': 0, 'Y': 0}
#字典拷贝
dictb=dicta.copy() #注意与直接赋值(dictb=dicta)浅拷贝的区别
for x in dictb.keys():
dictb[x]=97
print(dicta,dictb) # {'H': 0, 'I': 0, 'L': 0, 'A': 0, 'R': 0, 'Y': 0} {'H': 97, 'I': 97, 'L': 97, 'A': 97, 'R': 97, 'Y': 97}
#dict.get(key, default=None) 返回key的值,若key不存在则返回default值
print(dictb.get('A'),dicta.get('M')) # 97 None
#dict.__contains__(key) 判断key是否在字典中 在2.x中对应dict.has_key(key)
print(dicta.__contains__('A')) # True
#dict.items() 以列表返回可遍历的(键, 值) 元组数组
for x in dicta.items():
print(x,end=' ') # ('H', 0) ('I', 0) ('L', 0) ('A', 0) ('R', 0) ('Y', 0)
print('\n')
#dict.keys() 以列表返回一个字典所有的键
print(dicta.keys()) # dict_keys(['H', 'I', 'L', 'A', 'R', 'Y'])
#dict.update(dict2) 以dict2的内容更新dict
dictc={"name":"hilary","age":21,'A':13,'Y':29}
dicta.update(dictc)
print(dicta) # {'H': 0, 'I': 0, 'L': 0, 'A': 13, 'R': 0, 'Y': 29, 'name': 'hilary', 'age': 21}
#pop(key[,default]) 删除key及其所对应的值,返回值为被删除的值 若key不存在则返回default值
print(dicta.pop('address',None),dicta.pop('age',None)) # None 21
#清空字典元素
dictb.clear()
print(dictb) # {}
#删除字典
del dictb
一键多值字典
#一键多值字典 from collections import defaultdict dic=defaultdict(list) # 保留所有值以及值的插入顺序 dic['key1'].append(666) dic['key1'].append(999) dic['key2'].append(123) print(dic) # defaultdict(<class 'list'>, {'key1': [666, 999], 'key2': [123]}) dic=defaultdict(set) # 消除重复元素 dic['key1'].add(222) dic['key1'].add(333) dic['key1'].add(222) # key1 加入重复值 dic['key2'].add(444) print(dic) # defaultdict(<class 'set'>, {'key1': {333, 222}, 'key2': {444}})
有序字典
#有序字典(保留键的插入顺序) from collections import OrderedDict dic=OrderedDict() dic['key3']='i am key3' dic['key2']='i am key2' dic['key1']='i am key1' print(dic) # OrderedDict([('key3', 'i am key3'), ('key2', 'i am key2'), ('key1', 'i am key1')])
对字典值的操作
#对字典值的操作 dic={} dic['zhangsan']=152 dic['lisi']=29 dic['wangwu']=33 dic['hilary']=173 #得到值最小的元组 print(min(zip(dic.values(),dic.keys()))) # (29, 'lisi') #得到值最大的元组 print(max(zip(dic.values(),dic.keys()))) # (173, 'hilary') #按值排序 sortedDic=sorted(zip(dic.values(),dic.keys())) print(sortedDic) # [(29, 'lisi'), (33, 'wangwu'), (152, 'zhangsan'), (173, 'hilary')]
两字典的交集
#找到两个字典的交集 dic2={'zhangsan':111,'hilary':173,'mike':234,'tom':777} print(dic.keys() & dic2.keys()) # {'hilary', 'zhangsan'} 返回两字典中 键的交集 print(dic.keys() - dic2.keys()) # {'lisi', 'wangwu'} 返回两字典中 键的差 print(dic.items() & dic2.items()) # {('hilary', 173)} 返回两字典中 元素的交集
使用字典统计序列中出现次数最多的元素
collections中的Counter类是再好不过的选择。Counter在底层的实现中是一个字典,在元素和它们的出现次数之间做了映射。代码如下:
from collections import Counter
import random
lista=[]
for i in range(20):
lista.append(chr(ord('A')+random.randrange(0,3)))
print(lista)
# ['C', 'B', 'C', 'B', 'A', 'B', 'A', 'C', 'C', 'C', 'B', 'B', 'B', 'C', 'A', 'C', 'C', 'C', 'B', 'C']
cntdict=Counter(lista)
print(cntdict)
# Counter({'C': 10, 'B': 7, 'A': 3})
返回出现次数最多的K个元素:
K=2
print(cntdict.most_common(K))
# [('C', 10), ('B', 7)]
对该字典的更新:
listb=['A','A','A','B','B','Z'] cntdict.update(listb) print(cntdict) # Counter({'C': 10, 'B': 9, 'A': 6, 'Z': 1})
根据公共键对多个字典排序
根据某一个键值对一个字典序列进行排序操作,有如下两种方式:
一是使用operator模块下的itemgetter类,例如
from operator import itemgetter
dicts=[
{'name':'hilary','age':22,'uid':1030413107,'address':'chengdu,sichuan'},
{'name':'mike','age':37,'uid':1030413111,'address':'chengdu,sichuan'},
{'name':'tom','age':11,'uid':1030413122,'address':'mianyang,sichuan'},
{'name':'jerry','age':14,'uid':1030413125,'address':'mianyang,sichuan'},
{'name':'vergil','age':24,'uid':1030413117,'address':'shijiazhuang,hebei'}
]
sortedDicts=sorted(dicts,key=itemgetter('age'))
print(sortedDicts)
# [{'name': 'tom', 'age': 11, 'uid': 1030413122, 'address': 'mianyang,sichuan'},
# {'name': 'jerry', 'age': 14, 'uid': 1030413125, 'address': 'mianyang,sichuan'},
# {'name': 'hilary', 'age': 22, 'uid': 1030413107, 'address': 'chengdu,sichuan'},
# {'name': 'vergil', 'age': 24, 'uid': 1030413117, 'address': 'shijiazhuang,hebei'},
# {'name': 'mike', 'age': 37, 'uid': 1030413111, 'address': 'chengdu,sichuan'}]
二是使用lambda表达式,例如
sortedDicts2=sorted(dicts,key=lambda r:r['uid'])
print(sortedDicts2)
# [{'name': 'hilary', 'age': 22, 'uid': 1030413107, 'address': 'chengdu,sichuan'},
# {'name': 'mike', 'age': 37, 'uid': 1030413111, 'address': 'chengdu,sichuan'},
# {'name': 'vergil', 'age': 24, 'uid': 1030413117, 'address': 'shijiazhuang,hebei'},
# {'name': 'tom', 'age': 11, 'uid': 1030413122, 'address': 'mianyang,sichuan'},
# {'name': 'jerry', 'age': 14, 'uid': 1030413125, 'address': 'mianyang,sichuan'}]
注意上面两种操作同样适用于min()和max()函数:
print(max(dicts,key=itemgetter('name')))
# {'name': 'vergil', 'age': 24, 'uid': 1030413117, 'address': 'shijiazhuang,hebei'}
print(min(dicts,key=lambda r:r['age']))
# {'name': 'tom', 'age': 11, 'uid': 1030413122, 'address': 'mianyang,sichuan'}