一、创建字典
dict={key1:value1,key2:value2},用这种格式来创建字典。键必须是唯一的,但值是不必的。值可以是任意类型,而键是不可变的。
dict1={'z':123,'h':456}
print(dict1)
{'z': 123, 'h': 456} #输出
dict1=dict((('name','Tom'),('age',18)))#根据dict(mapping)方法变换而来
print(dict1)
{'name': 'Tom', 'age': 18} #输出
在上述代码中,括号里是元组,当然括号里也可以是列表,只要能达到一 一对应的关系即可。
也可利用关键字的方法创建字典:
dict1=dict(name='Tom',age=19)
print(dict1)
{'name': 'Tom', 'age': 19} #输出
注意: 关键字不需要加引号。
二、访问字典里的值
把相应的键放入到方括号中,如下:
dict1={'z':123,'h':456}
print("dict1['z']:",dict1['z'])
dict1['z']: 123 #输出
如果字典里没有要访问的键,会出现什么情况呢?
dict1={'z':123,'h':456}
print("dict1['y']:",dict1[y])
NameError: name 'y' is not defined #输出
三、修改字典
- 向字典中增加新的键值对
dict1={'z':123,'h':456}
dict1['y']=234
print(dict1)
{'z': 123, 'h': 456, 'y': 234} #输出
- 修改字典中已有的键值对
dict1={'z':123,'h':456}
dict1['h']=234
print(dict1)
{'z': 123, 'h': 234} #输出
- 删除字典的元素
删除字典中的某一元素:
dict1={'z':123,'h':456}
del dict1['z']
print(dict1)
{'h': 456} #输出
清空字典中所有元素:
dict1={'z':123,'h':456}
dict1.clear()
print(dict1)
{} #输出
删除字典:
dict1={'z':123,'h':456}
del dict1
那么dict1这个字典就已经消失了。
清空字典与赋值给字典为空字典的区别:
#清空字典
dict1={'z':123,'h':456}
dict2=dict1
dict1.clear()
print('dict1=',dict1)
print('dict2=',dict2)
#输出
dict1= {}
dict2= {}
dict1={'z':123,'h':456}
dict2=dict1
dict1={}
print('dict1=',dict1)
print('dict2=',dict2)
#输出
dict1= {}
dict2= {'z': 123, 'h': 456}
dict1与dict2是指向同一个内存单元,清空dict1,那么内存单元就被清空,这是第一种情况。给dict1赋值{ },那么dict1就指向其他的内存单元,而dict2仍然指向原来的内存单元。
四、字典键的特性
- 不允许同一个键在字典中出现两次。创建时如果同一个键被赋值两次,后一个值会被记住。
dict1={'name':'Tom','age':19,'name':'lily'}
print(dict1)
#输出
{'name': 'lily', 'age': 19}
- 键必须不可变,所以可以用数字,字符串或元组充当,而不能用列表。
dict1={['name']:'Tom','age':19}
print(dict1)
TypeError: unhashable type: 'list' #输出
五、字典的方法
- dict.fromkeys(s,v)
s是键值,v是键值对应的值(可选参数)。v的默认参数是None。
dict1=dict.fromkeys((1,2,3))
print(dict1)
{1: None, 2: None, 3: None} #输出
dict1=dict.fromkeys((1,2,3),'number')
print(dict1)
{1: 'number', 2: 'number', 3: 'number'} #输出
程序自动将’number’赋值给三个键。
那么我们肯定想输入三个参数分别赋值给三个键,这样可行吗?
dict1=dict.fromkeys((1,2,3),('number','aaa','zzz'))
print(dict1)
#输出
{1: ('number', 'aaa', 'zzz'), 2: ('number', 'aaa', 'zzz'), 3: ('number', 'aaa', 'zzz')}
那么python是将后面的三个参数以元组的形式一起赋值给键。
如果我们想批量修改字典的值,会出现什么效果呢?
dict1={'name':'Tom','age':19,'address':'China'}
dict2=dict1.fromkeys(('name','age'),'number')
print(dict2)
{'name': 'number', 'age': 'number'} #输出
那么就创建了一个新的字典,而不会修改字典的值。
- dict.keys()
dict1=dict.fromkeys(range(4),'棒!')
for eachkey in dict1.keys():
print(eachkey)
#输出
0
1
2
3
- dict.values()
dict1=dict.fromkeys(range(4),'棒!')
for eachvalue in dict1.values():
print(eachvalue)
#输出
棒!
棒!
棒!
棒!
- dict.items()
dict1=dict.fromkeys(range(4),'棒!')
for eachitem in dict1.items():
print(eachitem)
#输出
(0, '棒!')
(1, '棒!')
(2, '棒!')
(3, '棒!')
- dict.get()
当我们试图访问一个字典中不存在的数据,那么系统就会报错。接下来,我们来介绍一种访问字典中不存在数据但不报错的方法。
dict1=dict.fromkeys(range(4),'棒!')
print(dict1.get(4))
None #输出
那么输出值为None,None也是一个对象。
如果你希望当找不到键值的时候,返回一个具体的值,那么get()方法也是可以的。
dict1=dict.fromkeys(range(4),'棒!')
print(dict1.get(4,"没有"))
print(dict1.get(3,"没有"))
#输出
没有
棒!
字典中没有你想索引的值时,就会打印 ”没有“,反之,仍然会打印键对应的值 ”棒!“。
- in 与 not in
如果我们不知道一个键是否在字典内,我们可以通过in与not in来验证。
dict1=dict.fromkeys(range(4),'棒!')
print(4 in dict1)
False #输出
- copy()
copy()与赋值并不相同。
dict1={'z':123,'h':456}
dict2=dict1
dict3=dict1.copy()
print(id(dict1))
print(id(dict2))
print(id(dict3))
#输出
610282047992
610282047992
610282048072
由此我们可以看到,被赋值的字典与原字典指向同一内存单元,而copy后的字典是新拷贝的内存单元。
- pop()
dict1={'a':11,'b':12,'c':13}
dict1.pop('a')#指定删去某一键值对
print(dict1)
{'b': 12, 'c': 13} #输出
- popitem()
dict1={'a':11,'b':12,'c':13}
dict1.popitem()#随机删去字典中的某一键值对
print(dict1)
{'a': 11, 'b': 12} #输出
- setdefault()
dict1={'a':11,'b':12,'c':13}
dict1.setdefault('d')
dict1.setdefault('e',15)#向字典中插入数据,插入的位置是随机的
print(dict1)
#输出
{'a': 11, 'b': 12, 'c': 13, 'd': None, 'e': 15}
- update()
dict1={'a':11,'b':12,'c':13}
dict2={'c':15}
dict1.update(dict2)#用dict2更新dict1
print(dict1)
{'a': 11, 'b': 12, 'c': 15}