1、为什么Python中字典比列表快?
因为字典中是键-值对(key-value),且字典无顺序、自动去重、占用内存多,用内存换取速度。最重要的是因为字典是hash类型的。
2、那什么是hash呢?
哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。
如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。
3、dict会把所有的key变成hash 表,然后将这个表进行排序。
你通过data[key]去查data字典中一个key的时候,python会先把这个key hash成一个数字,然后拿这个数字到hash表中看没有这个数字, 如果有,拿到这个key在hash表中的索引,拿到这个索引去与此key对应的value的内存地址那取值就可以了。
查所有key及value
>>> a = {"a":"1","b":"2","c":"3"}
>>> a.keys()
dict_keys(['a', 'b', 'c'])
>>> a.values()
dict_values(['1', '2', '3'])
字典的创建方式
>>> person = dict(name='wang',age=27) #方式
>>>
>>> person
{'name': 'wang', 'age': 27}
>>> person = dict({"name":"wang","age":27}) #
>>>
>>> person
{'name': 'wang', 'age': 27}
>>> person = {"name":"wang","age":27} #
>>>
>>> person
{'name': 'wang', 'age': 27}
>>> keys = [1,2,3,4,5]
>>>
>>> {}.fromkeys(keys) ##
{1: None, 2: None, 3: None, 4: None, 5: None}
>>> {}.fromkeys(keys,12)
{1: 12, 2: 12, 3: 12, 4: 12, 5: 12}
>>>
>>> {}.fromkeys([1,2,3,4,5],13) ##
{1: 13, 2: 13, 3: 13, 4: 13, 5: 13}
增
>>> keys = {"a":1,"b":2,"c":3}
>>> keys
{'a': 1, 'b': 2, 'c': 3}
>>> a.keys()
dict_keys(['a', 'b', 'c'])
>>> keys["d"]=4
>>> keys
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> keys.setdefault("e",[1,2,3]) #增加
[1, 2, 3]
>>> keys
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': [1, 2, 3]}
>>> keys.setdefault("e",[1,2,3,5,6]) #有key不添加/修改,直接返回value
[1, 2, 3]
>>> keys
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': [1, 2, 3]}
删
>>> keys
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': [1, 2, 3]}
>>>
>>> del keys["a"]
>>> keys
{'b': 2, 'c': 3, 'd': 4, 'e': [1, 2, 3]}
>>> del keys
>>> keys
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'keys' is not defined
>>> k = {'b': 2, 'c': 3, 'd': 4, 'e': [1, 2, 3]}
>>>
>>> k
{'b': 2, 'c': 3, 'd': 4, 'e': [1, 2, 3]}
>>> k.pop("b")
2
>>> k
{'c': 3, 'd': 4, 'e': [1, 2, 3]}
>>> k.popitem() #随机删
('e', [1, 2, 3])
>>> k.popitem()
('d', 4)
>>> k.popitem()
('c', 3)
>>> k
{'SATA': '50G', 'SSD': '20G'}
>>> k.clear() #清空
>>> k
{}
修改
>>> s
{'a': '1', 'b': '2', 'c': '3'}
>>> s["c"]="4"
>>> s
{'a': '1', 'b': '2', 'c': '4'}
合并
>>> s1={'a': '1', 'b': '2', 'c': '5'}
>>>
>>> s.update(s1) #s1里的值覆盖掉s的值
>>> s
{'a': '1', 'b': '2', 'c': '5'}
查
>>> s['a']
'1'
>>> s['b']
'2'
>>> s['e'] #没有key报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'e'
>>> "a" in s #判断
True
>>> s.get("c") #取值
'5'
>>> s.get("g") #没有key的情况
>>> print(s.get("g")) #打印没有key的情况
None
>>> s.get("h",-1) #没有key指定返回-1
-1
>>> s.keys()
dict_keys(['a', 'b', 'c'])
>>> s.values()
dict_values(['1', '2', '5'])
>>> s.items() #包含所有键值元组的列表
dict_items([('a', '1'), ('b', '2'), ('c', '5')])
循环
>>> for i in s:
... print(i)
...
a
b
c
>>> for i in s:
... print(i,s[i])
...
...
a 1
b 2
c 5
>>> for i in s.keys():
... print(i)
...
a
b
c
>>> for i in s.values():
... print(i)
...
1
2
5
>>> for i in s.items():
... print(i)
...
('a', '1')
('b', '2')
('c', '5')
>>> for k,v in s.items():
... print(k,v)
...
a 1
b 2
c 5
长度
>>> len(s)
3
>>> del s["c"]
>>> s
{'a': '1', 'b': '2'}
>>> len(s)
2
0 Comments