DAY5 Python基础类型之字典

字典:

  (1)字典是python中的基本数据类型,能能够存储大量的关系型数据。

  (2)字典是由“键:值”对的形式存储数据的,键与值是一对多的关系,键是唯一

  (3)字典也称为映射,是python中唯一的映射关系。

  (4)字典的值是通过键来引用。

  # 可变类型数据与不可变类型数据:

  可变类型数据:又称为不可哈希的数据,例如:列表list,字典dict

  不可变类型数据:又称为可哈希的数据,例如:字符串str,数字int,元组tuple

  **** 字典的键必须是不可变类型的数据(通用使用字符串,数值作为键)*****

 

# 创建字典

方式一:直接创建
# 字典可以存储任意数目的数据类型
info = { 'name':'hesihao', 'age':23, 'city':'guangzhou', 'book':{'name':'python', 'price':80} }

方式二:dict()工厂函数
dic = dict({'name':'he','age':23})
print(dic)
>>>
{'name':'he','age':23}

方式三: fromkeys(iterable,value)
dic = dict.fromkeys([1,2,3],'he')
print(dic)
>>>
{1: 'he', 2: 'he', 3: 'he'}

#####知识点:fromkeys的陷进########
dic1 = dict.fromkeys([1,2,3],[])
print(dic1)
>>>{1: [], 2: [], 3: []}
dic1[1].append('alex')
print(dic1)
>>>{1: ['alex'], 2: ['alex'], 3: ['alex']}
print(id(dic1[1]))
print(id(dic1[2]))
print(id(dic1[3]))
>>>

1823385461640
1823385461640
1823385461640

总结:通过fromkeys()的默认值如果是一个[]空列表的话,这个列表是共用的,对列表进行操作,会影响到其他键值对。。。

# 字典的具体操作

 (1)增

  #两种方法:

  第一种:字典['键'] = 值,若有此键就修改,如果没有就添加。

  第二种:setdefault(k,d=None), 若有这个键就不变,没有这个键就添加(可以设置默认值)

'''第一种:‘字典['键'] = 值’  若有这个键就修改,否则就添加''
info = {
    'name':'he',
    'age':23,
    'city':'guangzhou',
}

# sex这个键不存在,所以会添加新的键值对
info['sex'] = 'male'
print(info)
>>>{'name': 'he', 'age': 23, 'city': 'guangzhou', 'sex': 'male'}

# age这个键已经存在,所以会修改其对应的值
info['age'] = 18
print(info)
>>>{'name': 'he', 'age': 18, 'city': 'guangzhou', 'sex': 'male'}
'''第二种:setdefault(k,d=None)  若有这个键就不变,没有这个键就添加(可设置默认值) '''

info = {
    'name':'he',
    'age':23,
    'city':'guangzhou',
}

# sex这个键不存在,所以添加,并且返回对应的值
new_value=info.setdefault('sex','male')       
print(info)
print(new_value)
>>>{'name': 'he', 'age': 23, 'city': 'guangzhou', 'sex': 'male'}
>>>male

#字典中有此key,不做任何操作,但会返回此键对应的值!!!!
new_value = info.setdefault('name','sitian')   
print(info)
print(new_value)
>>>{'name': 'he', 'age': 23, 'city': 'guangzhou'}
>>>he

  (2) 删

  第一种方法:del语句  

    del dict[key] : 删除对应的键值对,如果键不存在会报错。

    del dict  : 在内存级别删除整个字典。

info = {
    'name':'he',
    'age':23,
    'city':'guangzhou',
}

# 键存在,则删除对应的键值对
del  info['city']
print(info)
>>>{'name': 'he', 'age': 23}

#若键不存在,则会报错
del info['book']
print(info)
>>>
KeyError: 'book'


#在内存级别,删除整个列表
del info

  第二种方法:

'''pop(k,None):通过键去删除键值对,也有返回值;如果键不存在,会报错(添加None参数解决)'''
info = {
    'name':'hesihao',
    'age':23,
    'city':'guangzhou',
    'book':{'name':'python',
            'price':80}
}
# 键存在,会删除并返回被删除的元素
res = info.pop('book')           
print(res)
print(info)
>>> male
>>>{'name': 'hesihao', 'age': 23, 'city': 'guangzhou'}

# 如果键不存在,则会报错
res = info.pop('job')
print(res)
print(info)
>>>KeyError: 'job'

#上面的报错,可以通过设置默认值来解决,若键不存在,则返回指定的值
re1 = info.pop('name1','没有此键')   #没有此键,但是默认值时,会返回默认值。
print(re1)
>>>没有此键

  第三种方法:

  '''clear():清空字典键值对,单保留自己本身'''

dic = {'name':'hesihao','age':23}
dic.clear()
print(dic)
>>>{}

  第四种方法:

'''popitem(): 3.5以前的版本随机删除某个键值对,并返回。3.6版本默认删除最后一个元素并返回,意义不大'''
dic = {'name':'hesihao','age':23}
res = dic.popitem()
print(res,type(res))   #返回元组,元组第一个元素为键,第二个元素为值

 (3)改

  第一种方法:通过 dict[key] = value,如果key存在,则修改其对应值

info = {
    'name':'hesihao',
    'age':23,
    'city':'guangzhou',
    'sex' : 'male'
}
info['city'] = 'shenzhen'
print(info)
>>>{'name': 'hesihao', 'age': 23, 'city': 'shenzhen', 'sex': 'male'}

  第二种方法:update()

dic = {'name':'he','age':23}
dic.update(city='guangzhou',job='python')    #通过key=value的形式,把键值对追加到字典中
print(dic)


#对于两个字典:将dic2中的所有键值对覆盖并添加到dic1中
dic1 = {'name':'jin','age':'18','sex':'male'}
dic2 = {'name':'alex','weight':75}
dic1.update(dic2)
print(dic1)
print(dic2)
>>>
{'name': 'alex', 'age': '18', 'sex': 'male', 'weight': 75}
{'name': 'alex', 'weight': 75}

 (4) 查

  第一种方法:dict[key] ---> value

info = {
    'name':'hesihao',
    'age':23,
    'city':'guangzhou',
    'sex' : 'male'
}
print(info['name'])
print(info['age'])

  第二种方法:get()方法

#1.如果有对应的值,返回value
info = {
    'name':'he',
    'age':23,
    'city':'guangzhou',
    'sex' : 'male'
}
print(info.get('name'))
>>>he

#2.如果没有对应的值,返回None,不会报错
res = info.get('job')
print(res)
>>>None

#3.可以设置默认的返回值:dict.get(key,default)
res = info.get('job','python')
print(res)
>>> python

  第三种方法:遍历字典

(1) dict.keys()---->返回字典的所有键
(2) dict.values() -----> 返回字典的所有值
(3) dict.items()----->返回所有键值对
info = {
    'name':'hesihao',
    'age':23,
    'city':'guangzhou',
    'book':{'name':'python',
            'price':80}
}

key_list = [ key for key in info.keys()]
print(key_list)

value_list = [ value for value in info.values()]
print(value_list)

for k,v in info.items():
    print(f'Key:{k}')
    print(f'Value:{v}')
    

# 补充知识点:

  题目一: dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'},把含有"k"的键删除。

dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'}
for i in dic.keys():
    if 'k' in i:
        del dic[i]
print(dic)
>>>
RuntimeError: dictionary changed size during iteration

-----为什么会报错呢?有过列表的经验,我们应该很快就能定位到问题。在循环中修改字典,字典就会相对应的发生了变化----------
# 谨记:在循环一个字典时,不能改变字典的大小
# 思路:可以在循环一个其他数据类型的时,对字典进行修改
# 方式一:
dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'}
dic1 = {}
for i in dic.keys(): #['key1','key2','k3']
if 'k' not in i:
dic1[i] = dic[i]
dic = dic1
print(dic1)

#方式二:可以循环列表中,修改字典,这样就不会影响了
lst =[]
for key in dic:
if 'k' in key:
lst.append(key)
for key in lst:
dic.pop(key)
print(dic)

# 在观察一下,上面的low写法,其实可以改变一下:
dic = {'key1':'value1','key2':'value2','k3':'v3','name':'alex'}
for i in list[dic.keys()]:      # 把dic.keys()转化为一个列表,这样就可以i循环的元素固定下来
    if 'k' in i:
        del dic[i]
print(dic)

  

  

 

 

 

  

 

posted @ 2018-08-08 15:59  hehehe1994  阅读(162)  评论(0编辑  收藏  举报