一,字典的定义:
字典是key-value键值对的集合,是可变的,无序的,key唯一的
二,字典的初始化:
(1)定义空字典:d=dict() 或者 d={}
(2)dict(**kwarg)使用name=value对初始化一个字典
例:
d=dict(a=1,b=2,c=2) #其中的a,b,c需要为标识符,可以被赋值,而int和str可以被赋值吗?不可以的
(3)dict(iterable,**kwarg)使用可迭代对象和name=value对构造字典,不过可迭代对象的元素必须是一个二元结构.
例:
d=dict(((1,'c'),(2,'f')))
d=dict(([3,'x'],[4,'y']))
(4)dict(mapping,**kwarg)使用一个字典构建另一个字典
(5)d={'a':10,'b':20,'c':None,'d':[1,2,3]}
(6)类方法dict.fromkeys(iterable,value)
d=dict.fromkeys(range(5))
d=dict.fromkets(range(5),0)
三.字典元素的访问
(1)d[key] 返回对应的value值,key若不存在则抛出keyerror异常
(2)get(key[,default]) 返回key对应的value值,若key不存在则返回缺省值,未设置缺省值返回None
(3)setdefault(key[,default]) 返回key对应的value值,若key不存在添加kv对,value为default,并返回default,若default没有设置则缺省值为None.
四.字典元素的修改
(1)d[key]=value 将key对应的值修改为value,若key不存在则添加新的kv对
(2)update[other] -> None
使用另一个字典的kv对更新本字典,若key不存在就添加;若key存在则覆盖已经存在的key对应的值;是就地修改.
例:
d={}
d.update(red=1)
d.update((('red',2),))
d.update({'red':3})
五.字典的删除
(1)pop(key[,deffault]) 若key存在则移除它并返回它的value,key不存在返回给定的default,若default未设置且key不存在则抛出KeyError异常.
(2)popitem() 移除并返回一个任意的键值对,字典为empty抛出KeyError异常
(3)clear() 清空字典
(4)del语句
举例说明:
b=[6]
d={'a':3,'b':b,'c':100}
id(b),id(d['b'])
del b
print(b)
print(d['b'])
我们得出结论,del b 看起来像是删除了一个对象,但本质上是减少了一个对象的引用,del实际上删除的是名称,而不是对象.
六.字典的遍历
for ... in dict:
(1)遍历key
for k in d:
print(k)
for k in d.keys():
print(k)
(2)遍历value
for k in d:
print(d[k])
for k in d.keys():
print(d.get(k)) #k在keys()中,得到k就是得到key
for v in d.values():
print(v)
(3)遍历items,即kv对
for item in d.items():
print(item)
for item in d.items():
print(item[0],item[1]) #item[0]为key,item[1]为value
for k,v in d.items():
print(k,v)
for k,_ in d.items():
print(k)
for _,v in d.items():
print(v)
总结:
Python3中,keys,values,items方法返回一个类似生成器的可迭代对象,不会把函数的返回结果复制到内存中. 1)Dictionary view 对象 2)字典的entry的动态视图,字典变化,视图,将反映出这些变化
Python2中,上面的方法会返回一个新的列表,占据新的内存空间.所以Python2中建议使用iterkeys,itervalues,iteritems版本,返回一个迭代器而不是一个copy.
七.字典遍历和移除
如何在遍历的过程中移除元素?
错误解法:
d=dict(a=1,b=2,c='abc')
for k,v in d.items():
d.pop(k)
正确解法:
d=dict(a=1,b=2,c='abc')
keys=[]
for k,v in d.items():
if isintance(v,str):
keys.append(k)
for k in keys:
d.pop(k)
print(d)
八.字典的key
key的要求和set一样:
set的元素可以看作key,set可以看作简化版的dict.
hashable 可哈希才可以作为key,可使用hash()测试
d={1:0,2.0:3,"abc":None,("hello","world","python"):"string",b'abc':'135'}
九.defaultdict
collections.defaultdict([default_factory[,...]])
第一个参数是default_factory,缺省值是None,它提供一个初始化函数.当key不存在时,会调用这个工厂函数来生成key对应的value.
例:
这是不利用defaultdict的所作所为
import random
d1={}
for k in 'abcdef':
for i in range(random.randint(1,5)):
if k not in d.keys():
d1[k]=[]
d1[k].append(i)
print(d1)
这是用了defaultdict的所作所为
from collections import defaultdict
import random
d1=defaultdict(list)
for k in 'abcdef':
for i in range(random.randint(1,5)):
d1[k].append(i)
print(d1)
十.collections.OrderedDict([items])
key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序.
例:
from collections import OrderedDict
import random
d={'banana':3,'apple':4,'pears':1,'orange':1}
print(d)
keys=list(d.keys())
random.shuffle(keys)
print(keys)
od=OrderedDict()
for key in keys:
od[key]=d[key]
print(od)
print(od.keys())
(1)有序字典可以记录元素插入顺序,打印时也按照这个顺序输出打印
(2)3.6版本的Python的字典就是记录key插入的顺序(IPython中不一定有效果)
(3)应用场景: 假如使用字典记录了N个产品,这些产品使用ID由小到大加入到字典中;
除了使用字典检索的遍历,有事需要取出ID,但是希望是按照输入的顺序,因为输入是有序的;
否则还需要重新把遍历的值排序.