(十二)字典简介及字典的用法

举个例子,如果一个公司要存员工的信息,应该怎么去存,怎么去取?列表可以吗?
info=[["alex",22,"teacher",3000], ["oldboy",56,"teacher",4000,13022452346...],... ]如果按照这么存,那么取得时候肯定按照索引去取
info.index(["oldboy",56,"teacher",4000,..])要把所有的信息都写出来,才能提取,试问,都知道所有的信息了,还取什么?再说若果有几千行数据,怎么去查找呢?
显然:列表存这样的数据时不行的。要用字典,字典格式如下例子:
 
字典的一个特性:字典是无序的。为什么是无序的,列表为什么有序?
通过key就能取到值,不通过下标。而列表里面之所以有顺序,是因为通过下标能取值,是因为列表里有一个表,暂时理解为“索引表”。
而字典里,没有“索引表”,所以说没顺序了,
 
字典的key是唯一的,天生就是唯一的,字典是怎么实现的唯一?
字典通过hash来实现的,也叫散列,通过一些数学算法,你传给它一些字符串,生成一些数字且是唯一的数字,如下图:

注意:-2104520618,在当前程序是唯一的,退出后,重新hash,就不是这个数字了。

为什么字典,和hash有关系?

每一个key值,先转成hash值,举个例子如下,把“alex”,“jack”,“rain”分别hash,得到一个数:
[1212,232,434,5656,34331]
["alex","jack","rain"]
字符串,“alex”,“jack”,“rain”之间没有一点儿规律和联系,除非在数字之间去找规律:给数字排序,在数字之间找联系
[232,434,1212,5656,34331],然后就可以用到算法:
比如:
[232,434,555,666,777,888,1212,5656,34331]怎么找到5656?
第一步,先找到中间的777,然后判断,再取中间值判断

第二步:找规律,有多少数据,就找2的多少次方,如果有42亿数据,找32次就找出来了。

如果让“alex”in ["alex","jack","rain"],找alex,加入这个列表有10000个,alex在第5000个,思路同上,这就是算法的魅力。
这样查找就快了。
hash表已经是排序好的了,这就是字典快的原因,而列表还要排序,维护一个“索引表”。
字典的用法:
----增
----删
----改
----查
names = {
"stu1101":{"name":"Alex","age":22,"hobbie":"girl"},
"stu1102":"Jack",
"stu1103":"rain",
}
查:
(1)print(names["stu1101"]["hobbie"])-----------查
print(names["stu1104"]["hobbie"])-------------stu1104没有会报错-----------------------先判断在不在:
(2)print("stu1101" in names )----------------------True---在
print("stu1104" in names )----------------------False----不在
(3)print(names.get("stu1104"))----------没有返回一个 none
print(names.get("stu1101"))-------------有的话返回值
print(names.get("stu1104","asdfg"))------自定义一个值,返回asdfg
增:
names["stu1104"] = ["yangJian",31,"DBA"]
print(names)
改:
names["stu1104"][0] = "YANGJIAN"
print(names)
删:
(1)print(names.pop("stu1102"))
print(names)
(2)del names["stu1103"]
print(names)
————————————————————————————————————————————————
formkeys:
(1)
names = ["Jack","alex","eric"]
print (dict.fromkeys(names,0))
(2)
names = ["Jack","alex","eric"]
n3 = dict.fromkeys(names,1)
n3["Jack"]=2
print(n3)
{'Jack': 2, 'alex': 1, 'eric': 1}
(3)
names = ["Jack","alex","eric"]
n3 = dict.fromkeys(names,[1,2,3])
n3["Jack"][1]=9
print(n3)
{'Jack': [1, 9, 3], 'alex': [1, 9, 3], 'eric': [1, 9, 3]}-----为什么都变了?
看内存地址:
names = ["Jack","alex","eric"]
n3 = dict.fromkeys(names,[1,2,3])
#n3["Jack"][1]=9
print(id(n3["Jack"]),id(n3["eric"]))
5961568 5961568-----------------------------------------------内存地址一样
解释: a = 23 b =a a =40 b =23
a = [1,2,3]
b =a
现在把里面的2改成9,这时候a没有开辟新的内存空间
,只是把2变成9,内存空间不变化
————————————————————————————————————
items:一般来做循环
因为print(names.items())得到一个这样的列表: ('stu1102', 'Jack'), ('stu1103', 'rain')
变成一个元组,有k,v
(1)for key in names:
print(key,names[key])--------效率高

(2)for k,v in names.items():-----效率低
print(k,v)
-------------------------------------------------------------
keys vlaus
print(names.keys())
print(names.values())
-----------------------------------------------------------
popitem------随机删除
names.popitem()
print(names)
----------------------------------------------------------
setdefault:
print(names.setdefault("stu1106","Racheal"))
print(names)
---------------------------------------------------------
update:合并2个字典
d1 ={"stu1102":"JACK",1:333,2:444}
names.update(d1)
print(names)
--------------------------------------------------------
字典的特性:无序,去重,查询效率高
--------------------------------------------------------
copy:
names = {
"stu1101":{"name":"Alex","age":22,"hobbie":"girl"},
"stu1102":"Jack",
"stu1103":"rain",
}
n2 = names.copy()
print(names)
print(n2)
-----------------------------------------------------------
names = {
"stu1101":{"name":"Alex","age":22,"hobbie":"girl"},
"stu1102":"Jack",
"stu1103":"rain",
}
n2 = names.copy()
names["stu1103"] = "RAIN"________________________________>>>
print(names)
print(n2)

{'stu1101': {'name': 'Alex', 'age': 22, 'hobbie': 'girl'}, 'stu1102': 'Jack', 'stu1103': 'RAIN'}
{'stu1101': {'name': 'Alex', 'age': 22, 'hobbie': 'girl'}, 'stu1102': 'Jack', 'stu1103': 'rain'}

-----------------------------------------------------------------------------------------------
names = {
"stu1101":{"name":"Alex","age":22,"hobbie":"girl"},
"stu1102":"Jack",
"stu1103":"rain",
}
n2 = names.copy()
names["stu1103"] = "RAIN"
names["stu1101"]["age"]= 24-------------------------------->>
print(names)
print(n2)

{'stu1101': {'name': 'Alex', 'age': 24, 'hobbie': 'girl'}, 'stu1102': 'Jack', 'stu1103': 'RAIN'}
{'stu1101': {'name': 'Alex', 'age': 24, 'hobbie': 'girl'}, 'stu1102': 'Jack', 'stu1103': 'rain'}
----------------------------------------------------------------------------------------

 

 
 

 

 

 
原文地址:https://www.cnblogs.com/gaojun2017/p/6336456.html