了解python中字典的更加详细具体的操作,更灵活高效的使用python
dict的基本形式是键-值对(item),在本文中用key跟value表示
1.字典的创建
法一:直接使用{}创建,这是最常用的创建方式,通常是创建一个空字典,在往里面添加元素对
print('创建')
dic={'a':1,'b':2} #创建一
print(type(dic),dic)
#out: <class 'dict'> {'a': 1, 'b': 2}
在此引申出dict的几个性质:
1、dict的key有唯一性,如果存在对相同的key进行赋值,会将前一个值覆盖,在初始声明时亦是如此,key的value是他最后一个的赋值。
dic={'a':1,'b':2,'a':3}
print(dic)
#out: {'a': 3, 'b': 2}
2、dict的key值必须是可哈希的对象,在python中可哈希的对象都是不变对象,也就是说列表,字典,集合等不能作为dict的key值,但是元组可以
dic={'a':1,'b':2,['c','d']:3}
print(dic)
#out: error
dic={'a':1,'b':2,('c','d'):3}
print(dic)
#out: {'a': 1, 'b': 2, ('c', 'd'): 3}
法二:利用dict()函数创建,这样写较为简洁
dic=dict(a=11,b=22) #创建二
print(type(dic),dic)
#out: <class 'dict'> {'a': 11, 'b': 22}
但是这样创立的字典会默认key值是字符串,不能使用变量、数值或元组作为key键。但对于value没有限制
a='ABC'
dic=dict(a=123,b='abc',c=[1,2,3])
print(dic)
#out: {'a': 123, 'b': 'abc', 'c': [1, 2, 3]}
法三:将元组对列表转化为字典
dic=dict([('a',111),('b',222)]) #创建三,将元组对转化为字典。zip函数
print(type(dic),dic)
#out: <class 'dict'> {'a': 111, 'b': 222}
通常可以利用zip函数将两个列表转化为元组对再合并称为字典。dict()函数中的对象要是一个可迭代对象,zip的返回值是一个迭代器,而并不是一个直接的列表
lst1=['a','b','c']
lst2=[1,2,3]
dic=dict((zip(lst1,lst2)))
print(dic)
#out: {'a': 1, 'b': 2, 'c': 3}
法四:已知键集合,利用fromkeys初始化所有的键
dic={}.fromkeys(['a','b','c'],0) #创建四,已知建集合,初始化所有的键
print(type(dic),dic,'\n')
#out: <class 'dict'> {'a': 0, 'b': 0, 'c': 0}
需要注意的是fromkeys只能进行初始化操作,而不是添加。如果dic中原来存在item,会被全部清除,只保留新的初始值
dic1={'a':1,'b':2}
dic1=dic1.fromkeys(['x','y','z'],10)
print(dic1)
#out: {'x': 10, 'y': 10, 'z': 10}
dic2={'a':1,'b':2}.fromkeys(['x','y','z'],10)
print(dic1)
#out: {'x': 10, 'y': 10, 'z': 10}
OK
现在让我们来总结下字典创建的四种方式:
- 第一种,最常用的{}直接创建,要注意字典的每个键都是唯一的,重复的赋值会覆盖,且只有可哈希的对象能作为键,元组可以,列表不行。
- 第二种用dict(a=1),默认键为字符串,不能是变量跟元组。
- 第三种dict()加元组对列表,常跟zip函数使用。
- 第四种{}.fromkeys,在已知所有键值的时候统一进行初始化,会覆盖之前dic中的所有值,不能用作添加。
2.字典的查询
字典中的元素都是以键-值对的形式存在的,可以分别对这些项进行查询
print('查询')
dic={}.fromkeys(['a','b','c'],0)
print(dic.items(),'$',list(dic.items()))
print(dic.keys(),'$',list(dic.keys()))
print(dic.values(),'$',list(dic.values()))
#out:
#查询
#dict_items([('a', 0), ('b', 0), ('c', 0)]) $ [('a', 0), ('b', 0), ('c', 0)]
#dict_keys(['a', 'b', 'c']) $ ['a', 'b', 'c']
#dict_values([0, 0, 0]) $ [0, 0, 0]
dic的items(),keys(),values()都是专门的类别,可以转化为列表进行操作。
对dic的排序操作可以将dic转化为列表后操作,也可以直接用sorted()函数进行操作,但是操作之后返回的是列表。
dic={'a':5,'b':4,'c':3}
dic=sorted(dic,key=lambda x:dic[x])
print(dic)
#out: ['c', 'b', 'a']
3.字典的添加与修改
单个元素的添加与修改,直接用dic的键进行添加或修改
dic={'a':1,'b':2,'c':3}
dic['a']=4
dic['d']=4
print(dic)
#out: {'a': 4, 'b': 2, 'c': 3, 'd': 4}
批量添加修改:使用字典自带的update()函数
dic={'a':1,'b':2,'c':3}
dic.update({'a':4,'d':4,'e':5})
print(dic)
#out: {'a': 4, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
dic2={'x':1,'y':1}
dic.update(dic2)
print(dic)
#out: {'a': 4, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'x': 1, 'y': 1}
先判断是否存在,再进行添加。在实际操作中我们经常会遇到这种情况,需要先判断key是否存在dic中,如果不存在就创建一个新的item。可以用if语句判断,也可以用字典自带的setdefault()函数直接实现。
dic={'a':1,'b':2,'c':3}
dic.setdefault('a',4) #a已经存在与dic中所以不进行修改
dic.setdefault('d',4) #d不在dic中,添加
print(dic)
#out: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
合并字典将多个字典进行合并,如果有重叠部分,后面的item会覆盖之前的item
dic1={'a':1,'b':2,'c':3}
dic2={'d':4,'e':5}
dic3={'a':9,'f':6}
dic={**dic1,**dic2,**dic3}
print(dic)
#out: {'a': 9, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
OK
现在让我们来回顾一下字典的添加与修改:
- 首先最简单的单个元素的添加与修改,直接dic[key]=value。
- 如果需要批量添加与修改使用dic.update(dic*)。
- 合并字典其实也可以视为对字典进行批量修改的一种方式dic={**dic1,**dic2,**dic3}。
- 如果要先对key进行判断是否存在再进行添加,可以使用setdefault(key,value),每次只能添加一个,如果存在的话就不添加,不能进行修改。
4.字典的删除
单个元素删除,使用pop()方法
dic={'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
n=dic.pop('a')
m=dic.pop('x',404)
print(n,m,dic)
#out: 1 404 {'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
dic.pop() 根据key删除单个元素,不能省略参数。可以包含一个或两个参数,第一个为要删除的key,删除后返回key对应的value。第二个参数为如果要删除的key不存在时的返回值。如果只有一个参数,而key又不存在则会报错
随机删除一个item:popitem()
dic={ 'a': 1,'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
n=dic.popitem()
print(n,'$',dic)
#out: ('f', 6) $ {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
其实对于一个固定的dic,popitem()每次删除的item是固定的,之所以说‘随机删除’是因为字典本身的无序性
批量删除
使用del(dic[key]),但是没有返回值
dic={ 'a': 1,'b': 2, 'c': 3, 'd': 4}
del(dic['a'],dic['b'])
print(dic)
#out: {'c': 3, 'd': 4}
全部删除
dic.clear():清空dic内所有的items
del dic 直接删除dic
dic={ 'a': 1,'b': 2, 'c': 3, 'd': 4}
dic.clear()
print(dic)
#out: {}
del dic
print(dic)
#out: NameError: name 'dic' is not defined
OK
现在让我们来回顾一下字典的删除:
- 通过key删除单个元素,dic.pop(key,returnvalue)。会记录返回值,不能省略参数key,如果key不存在时会返回returnvalue。
- 随机删除一个item:dic.popitem()。
- 批量删除:del (dic[key1],dic[key2])
- 清除:dic.clear() 。del dic