1、字典的定义与初始化
1.1、python字典的特点:
key-value键值对的数据集合;
可变的,无序的,key去重;
key必须为可hash数据类型,value可以为任意数据类型;
1.2、定义与初始化
定义方法:
def __init__(self, seq=None, **kwargs): #known special case of dict.__ini
"""dict() -> new empty dictionary
dict(mapping) -> new dictionary initialized from a mapping object's
(key, value) pairs
dict(iterable) -> new dictionary initialized as if via:
d = {}
for k, v in iterable:
d[k] = v
dict(**kwargs) -> new dictionary initialized with the name=value pairs
in the keyword argument list. For example: dict(one=1, two=2)
# (copied from class doc)"""(1)d=dict()与d={} #定义空字典;
(2)dict(**kwargs) #使用name=value对初始化一个字典;
(3)dict(iterable,**kwargs)# 使用可迭代对象和name=value构造字典,不过可迭代对象的元素必须是一个二元结构:
例如:d=dict((['a','1'],['b','2'])) ==> {'a': '1', 'b': '2'}
(4)dict.fromkeys(iterable,value) # value不给默认为None
d=dict.fromkeys(range(5)) ==> {0: None, 1: None, 2: None, 3: None, 4: None}
d=dict.fromkeys(range(1,5),0)==> {1: 0, 2: 0, 3: 0, 4: 0}
2、字典的访问
# 访问方法:
(1)d[key]
返回key对应的value值
如果key不存在则抛出keyError异常
d=dict.fromkeys(range(1,5),0) # d={1: 0, 2: 0, 3: 0, 4: 0}print(d[1]) #==>0
(2)get[key]
返回key对应的value值
key不存在返回缺省值,如果没有缺省值则返回None
d=dict.fromkeys(range(1,5),0)print(d.get(0,'test')) #==>返回缺省值'test'
print(d.get(0)) #==>返回默认值None
print(d.get(1)) #==> 返回找到对应key的value 0
(3)setdefault(key,[,default])
返回key值对应的value
If keyis in the dictionary, returnits value.
key不存在,则添加kv对,value设置为default,
如果没有设置default,则为默认值None;
Ifnot, insert key with a value of default and returndefault. default defaults to None.
d={i:'a' for i in range(2)} #{0: 'a', 1: 'a'}
s1=d.setdefault(5,'b') #s1='b' d={0: 'a', 1: 'a', 5: 'b'}
s2=d.setdefault(6) #s2=None d={0: 'a', 1: 'a', 5: 'b', 6: None}
3、字典的增加与修改
3.1、字典的增加
(1)dict[key]=value
将key对应的值直接修改为value;
key不存在则添加新的kv对;
(2)update([other])==>None;
使用另外一个字典的kv对,更新本字典;
key不存在则添加,存在则覆盖;
就地修改(直接修改源字典)
例如:
dic={'a':1,'b':2}
dic.update(c=3,d=4)
print(dic)
'''
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
'''
nd={'f':5,'g':6}
dic.update(nd)
print(dic)
'''
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'f': 5, 'g': 6}
'''
3.2、字典的删除
(1)pop(key,[,default])def pop(self, k, d=None): #real signature unknown; restored from __doc__
"""D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
If key is not found, d is returned if given, otherwise KeyError is raised"""key存在,移除它,并返回它的value;
key不存在,返回给点的default,如果default没有设置,则抛出异常
(2)popitem()def popitem(self): #real signature unknown; restored from __doc__
"""D.popitem() -> (k, v), remove and return some (key, value) pair a
2-tuple; but raise KeyError if D is empty."""移除并返回任意的键值对;
字典为空,则抛出异常
4、字典的遍历
(1)遍历keyfor key indict:print(k)for key ind.keys()print(k)
(2)遍历valuefor key indict:print(dict[key])for key ind.keys():print(d.get(key))for value ind.values():print(value)
(3)遍历item,kv对for item ind.items():print(item)for item ind.items():print(item[0],item[1])for k,v ind.items():print(k,v)
总结:在python3中,keys,values.items方法返回一个类似一个生成器的可迭代对象,不会把函数的结果直接复制返回到内存中;1)dictionary view对象,可以使用len(),iter(),in操作2)字典的entry的动态的视图,字典变化,视图将反应出这些变化;3)keys返回一个类set对象,也就是可以看作一个set集合;如果values都是可hash,那么items也可以看作是一个类set对象;
5、字典遍历与移除
#字典在遍历的时候不能删除字典元素
d=dict(a=1,b=2,c='abc')#for k,v in d.items(): # 错误#d.pop(k)#
#while d:#for k in d.keys(): # 错误#d.pop(k)#print(d)
'''运行报错:RuntimeError: dictionary changed size during iteration,字典不能再遍历的时候删除字典元素;'''
#正确做法,先找到要删除的key,将key放到一个容器中,然后迭代这个容器
keys=[]for k,v ind.items():#if isinstance(v,str):
keys.append(k)for k inkeys:
d.pop(k)print(d)
6、defaultdict
# 众所周知,在Python中如果访问字典中不存在的键,会引发KeyError异常;
例如统计某个单词出现的次数:
strings = ('puppy', 'kitten', 'puppy', 'puppy','weasel', 'puppy', 'kitten', 'puppy')
d={}#for循环遍历
for kw instrings:
d[kw]+= 1 #报错,keyErr
#可以使用判断来实现
for kw instrings:if kw not ind:
d[kw]=1
else:
d[kw]+=1
#使用fromkeys实现
d=dict.fromkeys(strings,0)print(d)for k instrings:if k ind:
d[k]+=1
#################
以上的方法虽然在一定程度上解决了dict中不存在默认值的问题,但是这时候我们会想,
有没有一种字典它本身提供了默认值的功能呢?答案是肯定的,那就是collections.defaultdict;
defaultdict类就好像是一个dict,但是它是使用一个类型来初始化的;
from collections import defaultdict
d=defaultdict(list) # 这里必须传入一个指定可变类型例如:list,dict
d1=defaultdict(list)
d2=defaultdict(dict)
d1['a'].append(1)
d2['b']=2
print(d1)
print(d2)
'''
defaultdict(, {'a': [1]})
defaultdict(, {'b': 2})
''
# setdefault 可以代替defaultdict
d = {} #A regular dictionary
d.setdefault('a', []).append(1)
d.setdefault('a', []).append(2)
d.setdefault('b', []).append(4)print(d) #==>{'a': [1, 2], 'b': [4]}
7、orderedDict
# collections.Orderdict([items])
# Orderdict简单的的理解就是给无序的字典加入的顺序功能;
from collections importOrderedDict
d=OrderedDict()
d['foo'] = 1d['bar'] = 2d['spam'] = 3d['grok'] = 4
#Outputs "foo 1", "bar 2", "spam 3", "grok 4"
for key ind:print(key, d[key])'''运行结果:
foo 1
bar 2
spam 3
grok 4'''