Python中dict详解
概述:
使用键-值(key-value)纯纯,具有极快的查找速度
注意;字典是无序的
key的特性:
1 字典中的key必须唯一
2 key必须是不可变得对象
3 字符串、整数等都是不可变得,可以作为key
4 list是可变的,不能作为key
用字典,学生姓名为key,学生成绩作为值
dict1 = {"tom":60,"lilei":70}
1.元素的访问
dict1 = {"tom":60,"lilei":70}
print(dict1["lilei"]) #获取:字典名[key]
#(输出)70
当元素在dict中不存在时,运行就会报错
print(dict1["sunck"])
#(输出)KeyError: 'sunck'
此时,为了避免程序运行中被这种报错终止,我们常用下面这种方法:
print(dict1.get("sunck")) #没有 避免报错 返回None
#(输出)None
我们也可以对返回的None进行设置,简单比如;
if ret == None:
print("没有这个元素")
else:
print("有这个元素")
2.向dict中添加key和value
因为一个key 对因一个value,所以,多次对一个value赋值,其实就是修改值
dict1 = {"tom":60,"lilei":70}
dict1["hanmeimei"] =99
dict1["lilei"]=80
print(dict1)
#(输出){'tom': 60, 'lilei': 80, 'hanmeimei': 99}
3.(dict).pop()删除
dict1.pop(key)
dict1 = {"tom":60,"lilei":70}
dict1.pop("tom")
print(dict1)
#(输出){'lilei': 70}
4.dict的遍历
dict1.values() #查看dict中的values
dict1.keys() #查看dict中的keys
dict1 = {'tom': 60, 'lilei': 80, 'hanmeimei': 99}
for key in dict1:
print(key,dict1[key])
#(输出) tom 60
lilei 80
hanmeimei 99
print(dict1.values()) #查看dict中的values
#(输出)dict_values([60, 80, 99])
print(dict1.keys()) #查看dict中的keys
dict_keys(['tom', 'lilei', 'hanmeimei'])
for value in dict1.values():
print(value)
#(输出) 60
80
99
5.(dict).items()
dict1.items()
dict1 = {'tom': 60, 'lilei': 80, 'hanmeimei': 99}
print(dict1.items())
#(输出)dict_items([('tom', 60), ('lilei', 80), ('hanmeimei', 99)])
for k, v in dict1.items():
print(k,v)
#(输出) tom 60
lilei 80
hanmeimei 99
for i, v2 in enumerate(dict1):
print(i , v2)
#(输出) 0 tom
1 lilei
2 hanmeimei
6.(dict).update()更新字典
dict1 = {"a" : "apple", "b" : "banana"}
print(dict1)
#(输出){'a': 'apple', 'b': 'banana'}
dict2 = {"c" : "grape", "d" : "orange"}
dict1.update(dict2)
print(dict1)
#(输出){'a': 'apple', 'b': 'banana', 'c': 'grape', 'd': 'orange'}
7.(dict).clear() #将字典dict清空
dict1 = {"a" : "apple", "b" : "banana"}
dict1.clear()
print(dict1)
#(输出){}
8.(dict).fromkeys()
使用fromkeys() 函数用于创建一个新字典,以序列seq中元素做字典的键,value为字典所有键对应的初始值。
seq={"name","age","score"}
d=dict.fromkeys(seq,100)
print(d)
#(输出){'age': 100, 'name': 100, 'score': 100}
9.(dict).popitems()
seq={"name","age","score"}
d=dict.fromkeys(seq,200)
print(d)
#输出:{‘age‘: 200, ‘name‘: 200, ‘score‘: 200}
d2=d.popitem()
print(d2)
#输出:(‘age‘, 200)
print(d)
#(输出):{‘name‘: 200, ‘score‘: 200}
**10.dict(dict1, dict2)合并两个字典
合并两个字典可以先把两个字典分成key-value对,再连接两个key-value对,生成新的字典。即 dict(dict1.items()+dict2.items()) 。不过效率有些低。
使用效率更高的 dict(dict1, **dict2) 连接两个字典。
dict1= {'a': 1, 'b': 2, 'c': 3}
dict2= {'d': 4, 'e': 5, 'f': 6}
print(dict(dict1, **dict2))
#输出:{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
11.dict的拷贝
dict.copy()是一个浅拷贝,当遇到字典或者列表时,将不能完全拷贝。
深层拷贝字典建议使用copy模块的deepcopy()方法。
具体情况如下所示:
import copy
dict1 = {'a': [1, 2], 'b': 3}
dict2 = dict1
dict3 = dict1.copy()
dict4 = copy.deepcopy(dict1)
dict1['b'] = 'change'
dict1['a'].append('change')
print dict1
#(输出): {'a': [1, 2, 'change'], 'b': 'change'}
print dict2
#(输出): {'a': [1, 2, 'change'], 'b': 'change'}
print dict3
#(输出): {'a': [1, 2, 'change'], 'b': 3}
print dict4
#(输出): {'a': [1, 2], 'b': 3}
12.字典dict中cmp()方法
cmp() 函数用于比较两个字典元素。
注意:python3中已经删除了cmp()该函数。
dict1 = {'Name': 'Zara', 'Age': 7};
dict2 = {'Name': 'Mahnaz', 'Age': 27};
dict3 = {'Name': 'Abid', 'Age': 27};
dict4 = {'Name': 'Zara', 'Age': 7};
print "Return Value : %d" % cmp (dict1, dict2)
#(输出):-1
print "Return Value : %d" % cmp (dict2, dict3)
#(输出):1
print "Return Value : %d" % cmp (dict1, dict4)
#(输出):0
13.dict中zip()函数
Python3中zip在不同版本的不同反应了python的一个演变:大部分返回list的函数不在返回list,而是返回一个支持遍历的对象,比如map、fiter之类的,基本的例子如下:
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
xyz = zip(x, y, z)
print(xyz)
#(输出)<zip object at 0x0000024927FC9908> #返回一个支持遍历的对象
print (list(xyz))
#(输出)[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
所以常见于:
t1=["name","age","gender"]
t2=["milo",30,"male"]
#用for遍历一下
for each in zip(t1,t2):
print(each)
#(输出) ('name', 'milo')
('age', 30)
('gender', 'male')
14.dict查找在段落出现字符数
str = "AAAA is a good man! AAAA is a niceman! AAAA is a good man! AAAA is a good man! AAAA is a good man! \
AAAA is a hands man! AAAA is a boble man! AAAA is a good man!v is a cool man!"
#此处可以之前的count()函数 一步算出 比如w = "good" print(str.count(w)) #(输出)5。
但也可以用字典进行:
w = "good"
d = {}
l = str.split(" ") #空格切割字符串
for v in l: #循环处理历表中的每个元素
c = d.get(v)
if c== None:
d[v] = 1 #以元素当做key区提取数据
else: #如果没有提取到,则以该元素作为key,1作为value存进字典
d[v] += 1 #如果提取到,将对应的key 的value 修改 + 1
print(d[w]) #根据输入的字符串当做key再去字典取值
#(输出)5