一、集合set
可变的、无序的、不重复的元素的集合
set的元素要求必须可以hash,set可以迭代,元素不可以索引
定义:s=set()、s=set(iterable)
set元素增加:
s.add(elem)增加一个元素到set中,如果元素存在,什么都不做
s.update(*other)合并其他元素到set中,参数other必须是可迭代对象,就地修改
set删除元素:
s.remove(elem)从set中移除一个元素,元素不存在抛出keyerror
s.discard(elem) 从set中移除一个元素,元素不存在什么都不做
s.pop()移除并返回任意的元素,空集返回keyerror
s.clear()移除所有元素
set非线性结构,无法索引,要么删除,要么加入新的元素,没有修改的方法
可以对所有的元素进行遍历
线性结构的查询时间复杂度是O(n),即随着数据规模的增大而增加耗时
set,dict等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关
可hash类型:数值型int,float,complex、布尔型True,False、字符串string,bytes、元组tuple、None、以上都是不可变类型,称为可哈希类型,hashable
二、字典dict
可变的、无序的、key不重复、key-value键值对的数据的集合
定义:d=dict()、d={}、d=dict(**kwargs)使用name=value对初始化一个字典
d=dict(iterable,**kwargs)使用可迭代对象和name=value对构造字典,不过可迭代对象的元素必须是 一个二元结构。 d = dict(((1,'a'),(2,'b'))) 或者 d = dict(([1,'a'],[2,'b']))
dict(mapping, **kwarg) 使用一个字典构建另一个字典
dict(mapping, **kwarg) 使用一个字典构建另一个字典。d = dict.fromkeys(range(5))、d = dict.fromkeys(range(5),0)
字典元素的访问
d[key]返回key对应的值value ,key不存在抛出KeyError异常
d.get(key[, default]) 返回key对应的值value ,key不存在返回缺省值,如果没有设置缺省值就返回None
d.setdefault(key[, default]) 返回key对应的值value ,key不存在,添加kv对,value为default,并返回default,如果default没有设置,缺省为None
字典的增加和修改
d[key] = value 将key对应的值修改为value, key不存在添加新的kv对
d.update([other]) -> None 使用另一个字典的kv对更新本字典 , key不存在,就添加 ,key存在,覆盖已经存在的key对应的值 , 就地修改
d.update(red=1)、 d.update((('red',2),)) 、d.update({'red':3})
字典的删除
d.pop(key[, default]) key存在,移除它,并返回它的value ,key不存在,返回给定的default ,default未设置,key不存在则抛出KeyError异常
d.popitem() 移除并返回一个任意的键值对 ,移除并返回一个任意的键值对
d.clear() 清空字典
字典的遍历
遍历key:for k in d:print(k)、for k in d.keys(): print(k)
遍历value: for k in d: print(d[k])、for k in d.keys(): print(d.get(k))、for k in d.keys(): print(d.get(k))
遍历item,即kv对 :for item in d.items(): print(item) 、for item in d.items(): print(item[0], item[1]) 、for k,v in d.items(): print(k, v)
字典遍历和移除
若直接移除k,会影响字典的长度,而在遍历的过程中是不能改变字典的长度的。
defaultdict
collections.defaultdict([default_factory[, ...]]) 第一个参数是default_factory,缺省是None,它提供一个初始化函数。当key不存在的时候,会调用 这个工厂函数来生成key对应的value
strings = ('puppy', 'kitten', 'puppy', 'puppy',
'weasel', 'puppy', 'kitten', 'puppy')
d = {}
for words in strings:
d[words] += 1
print(d)
上面一段代码对单词出现的次数进行统计,但是由于d[words]没有默认值,无法进行+=计算,此时会抛keyerror
要解决这个问题,首先可能想到的方法是在单词第一次统计的时候,在d中相应的键存下默认值1。这需要在处理的时候添加一个判断语句:
strings = ('puppy', 'kitten', 'puppy', 'puppy', 'weasel', 'puppy', 'kitten', 'puppy') d = {} for words in strings: if words not in d: d[words] = 1 else: d[words] += 1 # d: # {'puppy': 5, 'weasel': 1, 'kitten': 2}
这样就解决了value的默认值的问题,也可以通过dict.setdefault()
方法来设置默认值:
strings = ('puppy', 'kitten', 'puppy', 'puppy', 'weasel', 'puppy', 'kitten', 'puppy') d = {} for words in strings: d.setdefault(words, 0) d[words] += 1
print(d)dict.setdefault()
方法接收两个参数,第一个参数是健的名称,第二个参数是默认值。假如字典中不存在给定的键,则返回参数中提供的默认值;反之,则返回字典中保存的值。
使用defaultdict实现:
defaultdict类的初始化函数接受一个类型作为参数,当所访问的键不存在的时候,可以实例化一个值作为默认值:
from collections import defaultdict d = defaultdict(list)
print(d['a']) =>[]
如上会设置value的默认值为[]
需要注意的是,这种形式的默认值只有在通过dict[key]
或者dict.__getitem__(key)
访问的时候才有效
defaultdict类除了接受类型名称作为初始化函数的参数之外,还可以使用任何不带参数的可调用函数,到时该函数的返回结果作为默认值,这样使得默认值的取值更加灵活:
from collections import defaultdict def zero(): return 0
d = defaultdict(zero)
print(d['a']) =>0
利用collections.defaultdict
来解决单词统计问题:
from collections import defaultdict strings = ('puppy', 'kitten', 'puppy', 'puppy', 'weasel', 'puppy', 'kitten', 'puppy') d = defaultdict(lambda: 0) # 使用lambda来定义简单的函数 for words in strings: d[words] += 1
通过上面的内容,想必大家已经了解了defaultdict类的用法,那么在defaultdict类中又是如何来实现默认值的功能呢?这其中的关键是使用了看__missing__()
这个方法:
>>> from collections import defaultdict >>> print defaultdict.__missing__.__doc__ __missing__(key) # Called by __getitem__ for missing key; pseudo-code: if self.default_factory is None: raise KeyError(key) self[key] = value = self.default_factory() return value
通过查看__missing__()
方法的docstring,可以看出当使用__getitem__()
方法访问一个不存在的键时(dict[key]这种形式实际上是__getitem__()
方法的简化形式),会调用__missing__()
方法获取默认值,并将该键添加到字典中去。
OrderDict
collections.OrderedDict([items]) key并不是按照加入的顺序排列,可以使用OrderedDict记录顺序
from collections import OrderedDict
import random
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
print(d)
keys = list(d.keys())
random.shuffle(keys)
print(keys)
od = OrderedDict()
for key in keys:
od[key] = d[key]
print(od)
print(od.keys())
有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印