Python学习笔记 - dict和set

dict

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#dict
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
>>> d['Adam'] = 67
>>> d['Adam']
67
>>> d['Jack'] = 90
>>> d['Jack']
90
>>> d['Jack'] = 88
>>> d['Jack']
88
>>> d['Thomas']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Thomas'
>>> 'Thomas' in d
False
>>> d.get('Thomas') # 这里返回None,命令交互行不会显示
>>> d.get('Thomas', -1) #返回子集指定的value
-1

>>> d.pop('Bob') #pop(key)方法,对应的value都会删除
75
>>> d
{'Jack': 88, 'Tracy': 85, 'Michael': 95, 'Adam': 67}

dict内部存放的顺序和key放入的顺序是没有关系的

和list相比较,dict有以下几个特点:

1.查找和插入的速度极快,不会顺着key的增加而增加

2.需要占用大量的内存,内存浪费多

而list相反:

1.查找和插入的时间随着元素的增加而增加;

2.占用空间小,浪费内存很少。





所以,dict是用空间来换取时间的一种方法。

dict可以用在需要高速查找的很多地方。

需要牢记的第一条就是dict的key必须是不可变对象。

这是因为dict根据key来计算value的存储位置,如果每次计算

相同的key得出结果不同,那dict内部就完全混乱了。这个通过key

计算位置的算法就是哈希算法(Hash)。

要保证hash的正确性,作为key的对象就不能变。

在Python中,字符串、整数等都是不可变的。

而list是可变的,就不能作为key。

>>> key = [1, 2, 3]
>>> d[key] = 'a list'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

set

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#创建set需要提供一个list作为输入集合
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
>>> s = set([1, 1, 2, 2, 3, 3]) #重复元素在set中自动被过滤
>>> s
{1, 2, 3}

>>> s.add(4) #添加元素
>>> s
{1, 2, 3, 4}
>>> s.add(4) #添加重复元素,不会有效果
>>> s
{1, 2, 3, 4}
>>> s.remove(4) #删除元素
>>> s
{1, 2, 3}
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2 #交集
{2, 3}
>>> s1 | s2 #并集
{1, 2, 3, 4}

#再谈不可变对象
>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']
>>> a = 'abc'
>>> b = a.replace('a', 'A') #这里虽然对a进行操作
#但是实际是产生了一个新字符串,并让b指向新字符串
>>> b
'Abc'
>>> a
'abc'

对于不可变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容,相反,这些方法会创建新的对象并返回,这样,就保证了不可变本身永远是不可变的。

上一篇:【shell学习笔记】curl命令总结


下一篇:python 函数递归与匿名函数