简介
set :set对象是由hashable 对象所组成的无序集合,set对象的每一个元素要求可进行哈希运算,set 会对内部元素进行去重,每个元素在同一个set 中只会出现一次,由于set对象可变性,所以set 对象自身不可哈希。
frozenset : frozenset 对象可以看成一个不可变set对象,是一个可哈希对象,可以最为frozenset、set 的元素或 dict 的 key 。
创建set对象
可哈希对象:在python常见的数据类型中,数值类型,字符串,元组,frozenset,bytes等属于可哈希对象。
# 直接创建
s1 = {1, 2, (1, 4), 'b', 0x23, "\x61"} # 内部元素为可哈希对象
s2 = set() # 空set,不可使用s = { }
# set( iter ) # 可迭代对象
s3 = set(range(5))
集合常用方法
frozenset的创建方法和set相同, 其他 共同的方法如下
# 向集合增加一个元素
s1 = set(range(5))
s1.add(6)
s1.add(4) # 当元素在set中已经存在,添加后set会自动对其去重
# 集合中删除元素
s1.remove(6) # 从集合中移除元素 6。如果 6 不存在于集合中则会引发KeyError。
s1.discard(4) # 如果元素 4 存在于集合中则将其移除,无返回值
s1.pop() # 从集合中移除并返回任意一个元素。如果集合为空则会引发KeyError。
s1.clear() # 从集合中移除所有元素
集合运算
- isdisjoint(other)
如果集合中没有与 other 共有的元素则返回 True。当且仅当两个集合的交集为空集合时,两者为不相交集合。- issubset(other)
set <= other
检测是否集合中的每个元素都在 other 之中。
set < other
检测集合是否为 other 的真子集,即 set <= other and set != other。- issuperset(other)
set >= other
检测是否 other 中的每个元素都在集合之中。
set > other
检测集合是否为 other 的真超集,即 set >= other and set != other。- union(*others)
set | other | ...
返回一个新集合,其中包含来自原集合以及 others 指定的所有集合中的元素。- intersection(*others)
set & other & ...
返回一个新集合,其中包含原集合以及 others 指定的所有集合中共有的元素。- difference(*others)
set - other - ...
返回一个新集合,其中包含原集合中在 others 指定的其他集合中不存在的元素。- symmetric_difference(other)
set ^ other
返回一个新集合,其中的元素或属于原集合或属于 other 指定的其他集合,但不能同时属于两者。- copy()
返回原集合的浅拷贝。
可以使用set运算直接进行运算,运算方式和数学中集合运算方式相同,例如:
s1 = set(range(10))
s2 = set(range(5,15))
# s1 ==> {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
# s2 ==> {5, 6, 7, 8, 9, 10, 11, 12, 13, 14}
# 交集
s3 = s1 & s2 # {5, 6, 7, 8, 9}
# 并集
s3 = s1 | s2 # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}
# 差集:从s1 中减去s2 中存在的元素
s5 = s1 - s2 # {10, 11, 12, 13, 14}
# 子集:
{1,2,4} <= {1,2,3,4} # True
# 对称差集: 返回两个集合中不同的元素
s6 = s1 ^ s2 # {0, 1, 2, 3, 4, 10, 11, 12, 13, 14}
frozenset 和 set 对象的比较是基于内部元素的比较,两个对象之间仍可以进行以上运算,但是运算结果是一个frozenset 对象,而不是set对象;
字典可以将一个可哈希值映射到一个任意对象,可以通过映射关系快速查找对应数据;所以在dict中的每一项由一个key-value对组成(也称pairs) ,其中key 会作为字典快速查找的的一个关键数据,所以要求一个字典中键必须是唯一,并可哈希,若在赋值过程中出现相同的key值,后者将会覆盖之前的内容。
创建dict对象
# key = value 键值对方式
d1 = dict( a=1,b=2,c=3 ) # {'a':1, 'b':2, 'c':3}
# mapping 对象创建
d2 = dict(d1, d =4 ) # {'a':1, 'b':2, 'c':3, 'd':4}
# iterable对象,对象中每一个元素必须有两个值分别作为key 和 value
d3 = dicrt([(1,2),(3,4),(5,6)]) # {1:2, 3:4, 5:6}
字典中方法
__massing__()
方法,d[key]将会以__missing__()
的return值作为d[key] 的内容# 该类实现了collections.defaultdict() 类相同的方法
class MyDict(dict):
def __init__(self, seq=list):
super().__init__
self.seq = seq
def __missing__(self, key):
return self.setdefault(key,self.seq())
mydic = MyDict(set)
for i in "abc":
mydic[i].add(1)
mydic["c"] # {1}
mydic # {'a': {1}, 'b': {1}, 'c': {1}}
# 批量造 key, 用列表,字符串,
# .fromkeys(iter, value)
d8 = dict.fromkeys(range(4), 100)
d8 # {0: 100, 1: 100, 2: 100, 3: 100}
d = {'a':1, 'b':2, 'c':3, 'd':4}
d["k"] # 找不到"k",将会报错
d.get("k", -1) # .get(key, default) # 找不到会返回设定的默认值-1
d.setdefault("k", 10) # 若"k" 存在,返回k的值,若不存在"k"不存在将会执行赋值操作d["k"] = 10,并返回 10
d = {'a':1, 'b':2, 'c':3, 'd':4}
d.setdefault("k",100) # setdefault(k, default=None)
d # {'a':1, 'b':2, 'c':3, 'd':4,'k':100}
update([other]):使用来自 other 的键/值对更新字典,覆盖原有的键。返回 None。
d = {'a':1, 'b':2, 'c':3, 'd':4}
for key in d.keys():
d.pop(key) # 改变字典长度,将会报错
# 解决方案
d = {'a':1, 'b':2, 'c':3, 'd':4}
for key in list(d.keys()): # 此时将dict视图对象提前遍历生成列表,再对列表进行遍历,不是对视图对象的遍历,将不会报错
d.pop(key)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。