Python-基础类型dict

用途

按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)]

posted @ 2020-12-01 09:20  王寄鱼  阅读(134)  评论(0编辑  收藏  举报