一.set
- 可变的,无序的,不重复的元素的集合
- set 里面的元素必须可以hash
- set 可以迭代
- set 不可以索引
- set查看元素时间复杂度是O(1)
1.set 初始化
- set()
- set(iterable)
2. set 常用方法
①add(elem)
- 增加一个元素到set中,如果元素存在,则不操作
②update(*others)
- 合并其他元素到set集合中
- 必须是可迭代对象
- 就地修改,返回None
③remove(elem)
- 从set中移除一个元素
- 如果元素不存在,则抛出KeyError异常
④discard(elem)
- 从set中移除一个元素,如果元素不存在,则不操作
⑤pop() -> item
- 移除随机的元素,并返回
- 空集返回keyError 异常
⑥clear()
- 移除所有元素
⑦ in
- in 和 not in 判断元素是否在set中
- 遍历 set
3.集合运算
集合概念
- 全集:所有元素的集合。例如实数集,所有实数组成的集合就是全集
- 真子集和真超集:A是B的子集,且A不等于B,A就是B的真子集,B是A的真超集
- 并集:多个集合合并的结果
- 交集:多个集合的公共部分
- 差集:集合中除去和其他集合的公共部分
python 符号 | 含义 | python方法 | 返回 |
---|---|---|---|
- | 差集 | difference(*others) | 新集合 |
-= | 差集 | difference_update(*others) | None |
& | 交集 | intersection(*others) | 新集合 |
&= | 交集 | intersection_update(*others) | None |
| | 合集,并集 | union(*others) | 新集合 |
= | 合集,并集 | union(*others | None |
^ | 对称差集 | symmetric_differece(other) | 新集合 |
^= | 对称差集 | symmetric_differece_update(other) | None |
4.集合判断
- issubset(other) <=
判断当前集合是否是另一个集合的子集 - set1 < set2
判断set1 是否是set2 的真子集 - issuperset(other), >=
判断当前集合是否是other 的超集 - set1 > set2
判断set1 是否是set 的真超集 - isdisjoint(other)
当前集合和另一个集合有没有交集
没有交集,返回True
二.字典
- key-value 键值对的数据的集合
- 可变的,无序的,key是唯一的
- key 一定是可以hash 的元素
1.dict 初始化
- d = dict() ,d = {}
- dict(**kwargs) 使用name=value对 初始化一个字典
1.使用数字作为key 的时候不可以使用name=value对,会出现报错SyntaxError: keyword can't be an expression
2.最好使用d = {1:'x',2:'y'}
构建或者二元结构等等其他方式。 - dict(iterable,**kwarg)使用可迭代对象 和name=value对构造字典,不过可迭代对象的元素必须是一个二元结构。
- dict(mapping,**kwarg) 使用一个字典构建另一个字典
注意引用类型 -
类方法dict.fromkeys(iterable,value)
dict.gif
2. dict常用方法
①查询字典元素
- d[key]
返回key对应的值,不存在则抛出KeyError异常 - get(key,[default])
如果key存在返回对应的值,不存在则返回缺省值,缺省值默认是None - setdefault(key,[default])
如果key存在返回对应的值,不存在,添加key-value对,value设置为default,并且返回default,如果defalut没有设置,缺省值为None
②增加和修改字典元素
- d[key] = value
1.如果key存在,则修改该key对应的value。
2.如果不存在, 则添加新的kv对 -
update([other]) -> None
1.使用另一个字典的kv对更新本字典
2.key不存在,就添加
3.key存在,覆盖已经存在的key对应的值
4.就地修改
d.update.gif
③删除字典的元素
-
pop[key,[default])
1.key存在,移除该kv对,并且返回对应的value
2.key不存在,default 没有定义,会报错KeyError 的异常- key不存在,defualt存在,则返回指定的default的值
-
popitem()
1.随机移除任意一个kv对,并且返回该kv对组成的元组。
2.如果是空字典,则会抛出KeyError的异常 -
clear() 清空字典
④字典遍历
- 遍历key
for ... in d
for ... in d.keys() - 遍历value
for ... in d.values() - 遍历 key-value
for item in d.items()
for k,v in d.items() - 字典在for 循环的时候不能改变字典
- 字典遍历总结
- python3 中,keys,values,items 方法返回一个类似生成器的可迭代对象,不会把函数的返回结果复制到内存中。
- dictionary view对象,可以使用len(),iter(),in 操作。
- 字典的entry的动态的视图,字典变化,视图将反映处这些变化。
- keys 返回一个类set对象,也可以看作是一个set集合,如果values都可以hash,那么items也可以看作是类set对象
- 在python2中,上面的方法会返回一个新的列表,开辟新的内存空间,所以python2 中建议使用iterkeys,itervalues,iteritems版本,返回一个迭代器,而不是返回一个copy
3. 默认字典
- defaultidict([default_factory[,...]])
default_factory 缺省是None,它提供一个初始化函数。当key不存在的时候,会调用这个工厂函数来生成key对应的value
from collections import defaultdict
d1 = defaultdict(list)
for k in 'abc':
for i in range(3):
d1[k].append(i)
print(d1)
#defaultdict(<class 'list'>, {'a': [0, 1, 2], 'b': [0, 1, 2], 'c': [0, 1, 2]})
4. 有序字典
- collections.OrderedDict([items])
1.可以记录key加入字典的顺序,打印的时候也按照这个顺序输出打印
from collections import OrderedDict
import random
d = dict(banana=3,apple=4,pear=1,orange=2)
print(d)
# {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
keys = list(d.keys())
random.shuffle(keys)
print(keys)
#['orange', 'banana', 'apple', 'pear']
od = OrderedDict()
for key in keys:
od[key] = d[key]
print(od)
#OrderedDict([('orange', 2), ('apple', 4), ('pear', 1), ('banana', 3)])
print(od.keys())
#odict_keys(['apple', 'orange', 'banana', 'pear'])
python3.6 的字典就是记录key的插入的顺序(IPython不一定有效果)
应用场景:
- 加入使用字典记录了N个产品,这些产品使用ID由小到大加入字典中。
- 除了使用字典检索的遍历,有时候需要取出ID,但是希望是按照输入的顺序,因为输入顺序是有序的
- 否则还需要重新遍历到值排序
网友评论