美文网首页
set ,dictionary

set ,dictionary

作者: 秋幻旎苏 | 来源:发表于2018-08-15 21:26 被阅读0次

一.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 的异常

    1. 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 循环的时候不能改变字典
  • 字典遍历总结
  1. python3 中,keys,values,items 方法返回一个类似生成器的可迭代对象,不会把函数的返回结果复制到内存中。
  2. dictionary view对象,可以使用len(),iter(),in 操作。
  3. 字典的entry的动态的视图,字典变化,视图将反映处这些变化。
  4. keys 返回一个类set对象,也可以看作是一个set集合,如果values都可以hash,那么items也可以看作是类set对象
  5. 在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不一定有效果)

应用场景:

  1. 加入使用字典记录了N个产品,这些产品使用ID由小到大加入字典中。
  2. 除了使用字典检索的遍历,有时候需要取出ID,但是希望是按照输入的顺序,因为输入顺序是有序的
  3. 否则还需要重新遍历到值排序

相关文章

网友评论

      本文标题:set ,dictionary

      本文链接:https://www.haomeiwen.com/subject/bxaibftx.html