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
Categories: python

0 Comments

发表评论

Avatar placeholder

邮箱地址不会被公开。 必填项已用*标注