用途
按key:value的形式存放多个任意类型的value,key反映的是value的属性
因为字典的key是不能重复的,所以我们也可以利用这个特点来去重
定义方式
在{}内用逗号分隔开多个key:value,其中value可以是任意类型,而key必须是不可变的类型,通常是字符串类型。若key为可变类型,会报错显示unhashable,确切的说,字典的key是必须要有__hash__属性的对象,以下为一个实验例子。
a = [1,2,3]
d = {a:a}
---------------
TypeError: unhashable type: 'list'
报错显示,list不是一个可以hash的类,查看list源码,发现hash方法为None,而str型中,hash方法有定义
# 部分源码
class object:
""" The most base type """
def __hash__(self, *args, **kwargs): # real signature unknown
""" Return hash(self). """
pass
'''
list类的源码中,__hash__设置了为None,所以虽然继承了object类,但是对于list来说,优先使用自己类中的
__hash__
'''
class list(object):
__hash__ = None
# 相同情况的还有set与dict
class set(object):
__hash__ = None
class dict(object):
__hash__ = None
我们发现,设置为None值的三个类型正好是仅有的三个可变类型。所以key必须是不可变类型
字典的key是唯一的
利用这一特点,我们可以利用字典来去重
d={'k1':111,'k1':222,'k1':333} # key重复,只保留一个最后一个
d1={'k1':333,'k1':222,'k1':111}
print(d)
print(d1)
------------------
{'k1': 333}
{'k1': 111}
生成字典
# 生成字典的方式1
l=[("name","egon"),("age",18),["gender","male"]]
res=dict(l)
print(res)
# 生成字典的方式2
d=dict(x=1,y=2,z=3)
print(d)
------------------------------------------
{'name': 'egon', 'age': 18, 'gender': 'male'}
{'x': 1, 'y': 2, 'z': 3}
# 生成字典的方式3
'''
通常利用fromkeys生成字典的值都设置为None,当然也可以是其他类型,不过不要设置为可变类型,因为此处的value存的是一个内存地址,如果是可变类型,当我们向其中添加数时,会使得所有的key对应的value都指向同一个可变类型。
'''
d1 = dict.fromkeys(('x', 'y', 'z'), None)
d2 = dict.fromkeys(['x', 'y', 'z'], None)
d3 = dict.fromkeys('xyz', None)
print(d1)
print(d2)
print(d3)
------------------------------
{'x': None, 'y': None, 'z': None}
{'x': None, 'y': None, 'z': None}
{'x': None, 'y': None, 'z': None}
"""
针对上一个注释,通过下面的小练习可以更好的理解
小练习:
res = {}.fromkeys(['k1','k2','k3'],[])
res.get('k1').append(123)
print(res)的结果是?
A:{'k1': [123], 'k2': [], 'k3': []}
B:{'k1': [123], 'k2': [123], 'k3': [123]}
C:报错
D:我TMD的也不知道
"""
答案:B
# 空字典
d={}
print(type(d))
字典去重
# 注意,字典本身是无序的,我们看到打印出来和原来的顺序一样是因为pycharm的优化
list1 = [1, 2, 3, 3, 4, 5, 5, 6]
d = dict.fromkeys(list1, None)
list1 = list(d)
print(d)
print(list1)
---------------------------
{1: None, 2: None, 3: None, 4: None, 5: None, 6: None}
[1, 2, 3, 4, 5, 6]
常用操作+内置的方法
优先掌握的操作:
字典取值
若key存在就取值,如不存在就加值,取值最好用get方法
# 直接利用key取值,若key不存在则报错
d = {'k1': 111, 'k2': 222}
print(d['k1'])
# print(d['k3']) # KeyError: 'k3'
-------------------
111
# 利用get取值,若不存在返回None
d = {'k1': 111, 'k2': 222}
print(d.get('k1'))
print(d.get('k3'))
------------------
111
None
# 利用get取值还可以自定义找不存在的key时的返回值,若不设置,默认返回None
d = {'k1':111,'k2':222}
res = d.get('k3','找一个存在的键啊,蠢蛋')
print(res) # 键不存在 返回get方法里面第二个参数
------------------------------------
找一个存在的键啊,蠢蛋
字典新增键值对
"""方式一:直接利用key"""
d = {'username': 'yang', 'password': 123}
d['hobby'] = 'study' # 字典的key不存在新增
print(d)
d['username'] = 'king'
print(d) # 字典的key存在则修改
----------------------------------------------
{'username': 'yang', 'password': 123, 'hobby': 'study'}
{'username': 'king', 'password': 123, 'hobby': 'study'}
"""方式二,update,特点与方法一相同,存在key就修改,不存在就添加,此处key为字符串"""
d = {'username': 'yang', 'password': 123}
d.update(hobby = 'study')
print(d)
d.update(username = 'king')
print(d)
-------------------------------
{'username': 'yang', 'password': 123, 'hobby': 'study'}
{'username': 'king', 'password': 123, 'hobby': 'study'}
# 若使用update方法,新增的key是一个变量,那么需要使用{:}的形式添加
x = 'xxx'
d = {'username': 'yang', 'password': 123}
d.update({x: 123}) # 注意这个花括号不能少
print(d)
-------------------------------
{'username': 'yang', 'password': 123, 'xxx': 123}
"""方式3 setdefault
键如果存在的情况下 那么不做修改 而是将对应的value取出
键如果不存在的情况下 那么就是新增
"""
d = {'username': 'yang', 'password': 123}
d.setdefault('xxx',123)
print(d) # 键不存在是新增
res = d.setdefault('username',123)
print(d)
print(res)
------------------------
{'username': 'yang', 'password': 123, 'xxx': 123}
{'username': 'yang', 'password': 123, 'xxx': 123}
yang
清空clear
d = {'k1': 111, 'k2': 222}
d.clear()
print(d)
-----------
{}
长度len
d={'k1':111,'k2':222}
print(len(d))
------------
2
成员运算in和not in
d={'k1':111,'k2':222}
print('k1' in d)
print(111 in d)
--------------------
True
False
删除
万能删除del
万能删除,没有返回值,代表的是单纯的删除
d={'k1':111,'k2':222}
del d['k1']
print(d)
------------
{'k2': 222}
随机删除popitem
返回一个元组
d = {'k1':111,'k2':222,'k3':333}
res = d.popitem()
print(d,res)
-----------------------
{'k1': 111, 'k2': 222} ('k3', 333)
取走操作pop
指定key删除,有返回值,代表的是取走操作。与列表不同的是,列表不写参数或默认取走最后一个元素,在字典中,必须要传参数,不然会直接报错。
d={'k1':111,'k2':222}
res=d.pop('k1')
print(d)
print(res)
-----------------------------
{'k2': 222}
111
键keys(),值values(),键值对items() 与for循环
# 键keys(),值values(),键值对items() 与for循环
d = {'k1':111,'k2':222,'k3':333}
for key in d.keys():
print(key,end=' ')
print()
for value in d.values():
print(value,end=' ')
print()
for k,v in d.items():
print(k,v)
---------------------------------
k1 k2 k3
111 222 333
k1 111
k2 222
k3 333
Python3 字典 keys() 方法返回一个可迭代对象,可以使用 list() 来转换为列表。可以获取字典中所有的键并利用list方法强转为列表
d = {'k1':111,'k2':222,'k3':333}
res1 = d.keys()
res1_iter = res1.__iter__() # 返回值拥有__iter__方法。说明是一个可迭代对象
print(res1,res1_iter)
-----------------------------------------------
dict_keys(['k1', 'k2', 'k3']) <dict_keyiterator object at 0x7f9b5fc435e0>
# 若要获取字典中所有的key,并存入列表
d = {'k1':111,'k2':222,'k3':333}
res = d.keys()
res1 = list(res)
print(res1)
----------------------
['k1', 'k2', 'k3']
Python 字典 values() 方法也返回一个可迭代对象,可以使用 list() 来转换为列表,列表为字典中的所有值。要将值存入列表的方法同上。
d = {'k1':111,'k2':222,'k3':333}
res1 = d.values()
res1_iter = res1.__iter__() # 返回值拥有__iter__方法。说明是一个可迭代对象
print(res1,res1_iter)
------------------------------------------
dict_values([111, 222, 333]) <dict_valueiterator object at 0x7f9c83043590>
Python 字典 items() 方法也返回一个可迭代对象。也可以利用list方法转为字典,不过其中的值为元组
d = {'k1':111,'k2':222,'k3':333}
res1 = d.items()
res1_iter = res1.__iter__() # 返回值拥有__iter__方法。说明是一个可迭代对象
print(res1,res1_iter)
------------------------------------
dict_items([('k1', 111), ('k2', 222), ('k3', 333)]) <dict_itemiterator object at 0x7fb6ca2435e0>
# 利用list方法
res1 = list(res)
print(res1)
-----------------------------------
[('k1', 111), ('k2', 222), ('k3', 333)]