使用dict和set


dict

  1、python内置了字典: dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度,创建一个dict有以下三种方法:

>>>d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}     # 注意是花括号和list不一样
>>>d = dict([('Michael', 95), ('Bob', 75), ('Tracy', 85)])
>>>d = dict(Michael=95, Bob=75, Tracy=85)
>>>d['Michael']
95

>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}

  把数据放入dict的方法,除了初始时指定外,还可以通过key放入,不过由于一个key只能对应一个value,所以多次对一个key放入value,后面的值会把前面的值冲掉:

>>>d['Jack'] = 90
>>>d['Jack']
90
>>>d['Jack'] = 88
>>>d['Jack']
88

  注意: 如果key不存在,dict就会报错。
  2、避免key不存在的错误: 有两种方法,一是通过in判断key是否存在:

>>>'Thomas' in d
False

  二是通过dict提供的get()函数 ,如果key不存在,可以返回None,或者自己制定的value:

>>>d.get('Thomas')          # 注意:返回None的时候python的交互命令行不显示结果
>>>d.get('Thomas', -1)
-1                             

  3、删除key: 要删除一个key,用pop(key)函数 或者del语句 ,对应的value也会从dict中删除:

>>>d.pop('Bob')
>>>del d['Bob']     # 和上面pop()效果一样   dict内部存放的顺序和key放入的顺序是没有关系的。
75
>>>d
{'Michael': 95, 'Tracy': 85}

  4、可以将dict中的所有key以list形式来获取:

>>> tel = {'jack': 4098, 'sape': 4139}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())            # 可以对keys进行排序并以list形式返回
['guido', 'irv', 'jack'] 

  4、dict和list比较:

  和list比较,dict有以下几个特点:
   1、查找和插入的速度极快,不会随着key的增加而变慢。
   2、需要占用大量的内存,内存浪费多。
  而list相反:
   1、查找和插入的时间随着元素的增加而增加。
   2、占用空间小,内存浪费很少。   
  小结: dict是用空间来换取时间的一种方法,dict可以用在需要高速查找的很多地方,在python代码中几乎无处不在,正确使用dict非常重要,需要牢记的第一条就是:dict的key必须是不可变的对象

set

  1、基本概念: set和dict类似,也是一组key的集合 ,但不存储value。在set中,没有重复的key ,并且key是无序的 。创建set可以使用一对花括号或者使用set()函数

>>>s = set(123)
>>>s = {123}    #与上面set()效果一样
>>>s
{1, 2, 3}    # 注意是花括号

  注意: 创建一个空集合的时候必须使用set()而非{}(创建一个空的dict时使用{})。
  2、方法:

  add(key): 添加元素到set中,可以重复添加,但不会有效果( 重复的元素在set中会自动被过滤):

>>>s.add(4)
>>s
{1,2,3,4}

  remove(key): 可以删除元素:

>>>s.remove(4)
>>>s
{1, 2, 3}

  3、集合操作: set可以看成数学意义上的无序和物重复元素的集合,因此两个set可以做数学意义上的交集、并集等操作:

>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # letters in a but not in b
{'r', 'd', 'b'}
>>> a | b                              # letters in a or b or both
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # letters in both a and b
{'a', 'c'}
>>> a ^ b                              # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}

  小结: set和dict的唯一区别仅在于没有存储对应的value,但是set的原理和dict一样,所以同样不可以放入
可变对象 ,因为无法判断两个可变对象是否相等,也就无法保证set内部不会有重复元素

不可变对象

  1、基本概念: 前面有说过,str是不变对象,而list是可变对象
  对于可变对象, 比如list,对list进行操作,list内部的内容是会变化的,比如:

>>>a = ['c', 'b', 'a']
>>>a.sort()
>>a
['a', 'b', 'c']

  而对于不可变对象, 比如str,对str进行操作呢:

>>>a = 'abc'
>>>a.replace('a', 'A')
'Abc'
>>>a
'abc'

  虽然字符串有个replace()方法,也确实变出了'Abc',但是变量a最后仍是'abc',应该怎么理解呢?我们先把代码改成下面这样:

>>>a = 'abc'
>>>b = a.replace('a', 'A')
>>>b
'Abc'
>>>a
'abc'

  要始终牢记的是:a是变量,而'abc'才是字符串对象! 有些时候,我们经常说,对象a的内容是'abc',但其实是指,a本身是一个变量,它指向的对象的内容才是'abc':

  当我们调用a.replace('a', 'A')时,实际上调用replace是作用在字符串对象'abc'上的,而这个方法虽然名字叫replace,但却没有改变字符串'abc'的内容。相反,replace方法创建了一个新字符串'Abc'并返回,如果我们用变量b指向该新字符串,就容易理解了。

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

  总结: 使用key-value结构存储的dict在python中非常有用,选择不可变对象作为key很重要,最常用的key是字符串。

原文地址:https://www.cnblogs.com/xipuhu/p/7456613.html