2.python-dict

python-dict

mapping 对象会将 hashable值映射到任意对象。 映射属于可变对象。 目前仅有一种标准映射类型 字典

字典是一种通过名字或者关键字引用的得数据结构, 这种结构类型也称之为映射。 其中 key 类型需要时被哈希,其键几乎可以是任何值,可以是数字、字符串、元组 ,同一个字典中相同的 key 只有一个。value 值可以任意,且可以相同 。 字典类型是Python中唯一內建的映射类型。

注意,浮点数比较很不精确,因此千万不要用浮点数作为key

常用属性方法

dict={}
	
keys(self)				# 以列表返回一个字典所有的键
values(self)				# 以列表返回字典中的所有值
items(self)				# 以列表返回可遍历的(键, 值) 元组数组

dict[key]			        # 返回以 key为键的项。如果映射中不存在 key 则会引发 KeyError
get(self,k,d=None)			# 返回指定键的值,如果值不在字典中返回default值
update(dict2)				# 将dict2的键值对更新到dict中
setdefault(self,k,d=None)	        # 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
fromkeys(seq[, val])                    # 创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值

pop(self,k,d=None)			# 删除给定键 key 所对应的值,返回值为被删除的值。key值必须给出。否则,返回default值
popitem(self)				# 随机返回并删除字典中的一对键和值

clear(self)				# 删除字典内所有的元素
copy(self)				# 返回一个字典的浅copy ,俗称赋值


# 其他内置函数
cmp(dict1, dict2)	          # 比较两个字典元素。
list(dict)			  # 返回字典中使用的所有键的列表
len(dict)			  # 返回字典中的项数
str(dict)			  #  输出字典中可以打印的字符串标识

reversed(dict)		          # 回一个逆序获取字典键的迭代器
del dict[key]		          # 将 d[key] 从 d 中移除。 如果映射中不存在 key 则会引发 KeyError。

key in dict			  # 如果 d 中存在键 key 则返回 True,否则返回 False。
iter(d)				  # 返回字典中的键、值 (键, 值)的迭代器。

创建初始化

字典可以通过将以逗号分隔的 键: 值 对列表包含于花括号之内来创建,例如: {'jack': 4098, 'sjoerd': 4127}{4098: 'jack', 4127: 'sjoerd'},也可以通过 dict构造器来创建。

class dict(**kwarg)

class dict(mapping, **kwarg)

class dict(iterable, **kwarg)

#创建一个空字典
a_dict = {}
b_dict = dict()

# 赋值创建1
c_dict = {'a':1,'b':'to','c':'63'}
d_dict = {1:2,3:4,5:6}

# 赋值创建2
d_dict = dict(a=1,b='to',c='63') 
e_dict = dict(zhang=10000,wang=10000,li=10000,zhao=10000)

# 赋值创建3 - 元组转字典
dict(zip(['a','b'],[1,2]))
{'a': 1, 'b': 2}

# 赋值创建4 - 元组转字典
dict([('a',1),('b',2)]) 
{'a': 1, 'b': 2}

seq = ('Google', 'Runoob', 'Taobao')
dict = dict.fromkeys(seq,value=10)	  # seq - 键的序列
print(dict)
# 结果
{'Google': 10, 'Taobao': 10, 'Runoob': 10}

# list/set/dict 均不可被哈希
list = [1,2,3,4]
info2 = {list:'number'}
输出
TypeError: unhashable type: 'list'

返回键值对

keys()		# 以类-列表形式返回 所有键(key) 顺序不是字典的顺序	
values()	# 以类-列表形式返回 所有值(value) 顺序和keys()返回的顺序对应
items()         # 返回可遍历元组(键,值) ,包含了dict 所有数据


dict ={'k1':'v1','k2':'v2','k3':'v3'}
#1,请循环遍历除所有的key

print(dict.keys(), type(dict.keys()))
print(dict.values(),type(dict.values()))
print(dict.items(),type(dict.items()))

# 输出
dict_keys(['k1', 'k2', 'k3']) <class 'dict_keys'>
dict_values(['v1', 'v2', 'v3']) <class 'dict_values'>
dict_items([('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')]) <class 'dict_items'>

# 转换成list
print(list(dict.keys()))
# 输出:
['k1', 'k2', 'k3']

增加键值

info ={'name':'zhangsan','age':'32'}
info['work'] = 'school'     # 增加一个不存在的key
print(info)
结果:
{'name': 'zhangsan', 'age': '32', 'work':'school'}

a_dict={'name':'zhangsan','age':'32'}
b_dict={'work':'beijing'}

b_dict.update('home'='shenzhen')
b_dict.update(a_dict)
print(b_dict)
# 结果
{'name':'zhangsan','age':'32','home':'shenzhen','work':'beijing'}

dict.setdefault(key, default=None)

dict = {'dog': '哈士奇', 'cat': 'Tom'}
res1=dict.setdefault('dog', "Tom")
res2=dict.setdefault('mouse','jack')
print(res1)
print(res2)
# 结果
哈士奇
jack

访问修改

主要是通过 key 来进行访问修改


# 案例1
info ={'name':'zhangsan','age':'32'}
print(info['name']) 
#输出
zhangsan
print(info['work'])   # 报错 KeyError

# 案例2
dict.get(key,default=None) # 字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。  

info ={'name':'zhangsan','age':'32'}
print(info.get('name')) 
print(info.get('work'))
# 输出
zhangsan
None

# 案例3
info ={'name':'zhangsan','age':'32'}
info['work']='beijing'

print(info)
# 输出
{'name': 'zhangsan', 'age': '32', 'work': 'beijing'}

删除键值

pop(key)      # 根据 key 值弹出 key,value, key 必须有,否则报错,删除 key,value, 返回value
popitem()     # 删除 dict(不为空)  底层存储的最后一个键值,         返回 tuple (key,value)
del dict[key]	# 根据 key 删除dict   无返回	

info ={'id';'1','name':'zhangsan','age':'32','work':'school'}
respop=info.pop('work')		
print(info)
print(respop)
结果:
{'id';'1','name': 'zhangsan', 'age': '32'}
school

respopitem=info.popitem()
print(respopitem)
# 结果:
('age','32')

del info['name']
print(info)
# j
{'id';'1'}

其他操作

字典排序

w_dict={'learn': 2, 'play': 1, 'work': 3}
# 按照字典降序排序,输出列表
# 通过sorted 函数 加 匿名函数方式
print(sorted(w_dict.items(), key=lambda  w_dict:w_dict[1],reverse=True))
# 结果
[('work', 3), ('learn', 2), ('play', 1)]

# 案例2
a_dic = {'a':{'val':3}, 'b':{'val':4}, 'c':{'val':1}}
# 通过val来进行降序排序
dict= sorted(a_dic.iteritems(), key=lambda d:d[1]['val'], reverse = True)
print(dict)
# 结果  
[('b', {'val': 4}), ('a', {'val': 3}), ('c', {'val': 1})]

合并字典

def merge_dict(dic1, dic2): 
    return {**dic1, **dic2} 
# python3.5后支持的一行代码实现合并字典 
merge_dict({'a': 1, 'b': 2}, {'c': 3}) 
# {'a': 1, 'b': 2, 'c': 3}

修改merged['x']=10,dic1中的x值 不变 , merged 是重新生成的一个 新字典 。


from collections import ChainMap
merged2 = ChainMap(dic1,dic2) 
print(merged2) 
# ChainMap({'x': 1, 'y': 2}, {'y': 3, 'z': 4})

ChainMap 却不同,它在内部创建了一个容纳这些字典的列表。因此使用ChainMap合并字典,
修改merged['x']=10后,dic1中的x值 改变 ,如

值最大字典

def max_pairs(dic): 
    if len(dic) == 0: 
        return dic 
    max_val = max(map(lambda v: v[1], dic.items())) 
    return [item for item in dic.items() if item[1] == max_val] 

r = max_pairs({'a': -10, 'b': 5, 'c': 3, 'd': 5}) 
print(r)
# [('b', 5), ('d', 5)]

topn字典

from heapq import nlargest 
# 返回字典d前n个最大值对应的键 
def topn_dict(d, n): 
    return nlargest(n, d, key=lambda k: d[k]) 

topn_dict({'a': 10, 'b': 8, 'c': 9, 'd': 10}, 3) 
# ['a', 'd', 'c']
posted @ 2021-06-29 21:40  贝壳里的星海  阅读(102)  评论(0编辑  收藏  举报