多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

python学习8 之 【集合、datetime模块、字典】

python学习8 之 【集合、datetime模块、字典】 目录1.集合1.1.集合的特点1.2.集合的创建1.3.基本操作1.4.集合运算1.5.集合关系判断1.6.frozenset2.datetime 模块2.1.主要类3.字典3.2.基础操作3.3.视图和遍历视图对象3.4.字典操作3.5.创建和转换3.6.字典比较3.7.字典排序输出3.8.常用模式速查1.集合集合是 Python 中的一种无序、可变的数据结构用于存储不重复的元素集合基于哈希表实现查找效率极高多用于去重1.1.集合的特点特性说明无序性元素无固定位置不支持索引访问唯一性自动去重不允许重复元素可变性可增删元素但元素本身必须可哈希元素限制只能包含不可变类型数字、字符串、元组等不支持索引和切片等序列操作1.2.集合的创建创建方式语法/函数说明示例结果花括号直接创建{元素1, 元素2, ...}直接使用花括号包含元素{apple, banana, orange}{apple, banana, orange}set()构造函数set(iterable)从可迭代对象创建集合自动去重set([1, 2, 3, 3, 4]){1, 2, 3, 4}字符串转集合set(string)将字符串的每个字符作为元素set(hello){h, e, l, o}元组转集合set(tuple)将元组转换为集合set((1, 2, 3)){1, 2, 3}范围转集合set(range())将 range 对象转换为集合set(range(5)){0, 1, 2, 3, 4}创建空集合set()必须用 set(){}是空字典empty_set set()set()集合推导式{表达式 for 变量 in 可迭代对象}类似列表推导式生成集合{x**2 for x in range(5)}{0, 1, 4, 9, 16}带条件的集合推导式{表达式 for 变量 in 可迭代对象 if 条件}筛选元素后生成集合{x for x in range(10) if x % 2 0}{0, 2, 4, 6, 8}1.3.基本操作添加和删除元素方法说明示例返回值add(x)添加单个元素s.add(5)Noneupdate(iterable)添加多个元素可迭代对象s.update([5,6,7])Noneremove(x)删除元素不存在时抛出KeyErrors.remove(3)Nonediscard(x)删除元素不存在时不报错s.discard(10)Nonepop()随机弹出并返回一个元素集合为空时抛出KeyErroritem s.pop()被弹出的元素clear()清空集合s.clear()None随机存储成员检查操作说明示例返回值x in s检查元素是否在集合中3 in {1,2,3}True/Falsex not in s检查元素是否不在集合中5 not in {1,2,3}True/False遍历集合操作说明示例返回值for x in s遍历集合中的每个元素for item in {1,2,3}: print(item)None执行循环enumerate(s)同时获取索引和元素for i, item in enumerate(s):迭代器复制import copy # 集合中包含可变元素如列表但注意集合本身不能包含列表因为列表不可哈希 # 更实际的例子集合中包含元组元组内包含可变对象 s1 {(1, [2, 3]), (4, [5, 6])} # 浅拷贝 s2 s1.copy() # 深拷贝 s3 copy.deepcopy(s1) # 修改原集合中的可变对象 for item in s1: item[1].append(99) break print(s1) # {(1, [2, 3, 99]), (4, [5, 6])} print(s2) # {(4, [5, 6]), (1, [2, 3, 99])} - 受影响 print(s3) # {(4, [5, 6]), (1, [2, 3])} - 不受影响集合自带 copy() 方法浅拷贝没有自带深拷贝需要使用 copy.deepcopy()由于集合元素必须是可哈希的不可变常见集合元素都是不可变的所以大多数情况下浅拷贝就足够使用s2 s1是拷贝引用任意改变都会影响对方1.4.集合运算返回新集合不修改原集合运算运算符方法说明示例返回值交集intersection(other, ...)同时存在于两个集合的元素a b新集合并集|union(other, ...)存在于任一集合的元素a | b新集合差集-difference(other, ...)在 a 中但不在 b 中的元素a - b新集合对称差^symmetric_difference(other)只存在于其中一个集合的元素a ^ b新集合a、b必须都是集合other只要是可迭代对象即可原地修改集合返回 None方法说明示例返回值intersection_update(other, ...)原地更新为交集a.intersection_update(b)Noneupdate(other, ...)原地更新为并集a.update(b)Nonedifference_update(other, ...)原地更新为差集a.difference_update(b)Nonesymmetric_difference_update(other)原地更新为对称差a.symmetric_difference_update(b)Noneother只要是可迭代对象即可1.5.集合关系判断关系类型运算符方法说明示例返回值子集issubset(other)判断当前集合的所有元素是否都在另一个集合中{1, 2} {1, 2, 3}True真子集无可用issubset加长度判断判断是否为子集且两个集合不相等{1, 2} {1, 2, 3}True超集issuperset(other)判断当前集合是否包含另一个集合的所有元素{1, 2, 3} {1, 2}True真超集无可用issuperset加长度判断判断是否为超集且两个集合不相等{1, 2, 3} {1, 2}True不相交无isdisjoint(other)判断两个集合是否有交集无共同元素{1, 2}.isdisjoint({3, 4})True1.6.frozensetfrozenset 是 Python 内置的不可变集合类型一旦创建就无法修改它与普通 set 的关系类似于 tuple 与 list 的关系frozenset 与 set 对比特性setfrozenset可变性可变可增删元素不可变创建后无法修改可哈希性不可哈希可哈希作为字典键不允许允许作为集合元素不允许允许集合运算支持支持修改方法add/remove/discard/pop 等仅有查询类方法创建方法创建方式语法示例结果从可迭代对象创建frozenset(iterable)frozenset([1,2,3])frozenset({1,2,3})从字符串创建frozenset(string)frozenset(hello)frozenset({h,e,l,o})从集合创建frozenset(set)frozenset({1,2,3})frozenset({1,2,3})空 frozensetfrozenset()frozenset()frozenset()从字典创建frozenset(dict)frozenset({a:1})frozenset({a})只用键查询与检查方法方法语法说明返回值示例len()len(fs)获取元素个数intlen(frozenset({1,2,3}))→3inx in fs检查元素是否在集合中bool2 in frozenset({1,2,3})→Truenot inx not in fs检查元素是否不在集合中bool4 not in frozenset({1,2,3})→True集合运算方法返回新 frozenset方法运算符说明示例结果intersection()交集fs1.intersection(fs2)两个集合的公共元素union()|并集fs1.union(fs2)两个集合的所有元素difference()-差集fs1.difference(fs2)在 fs1 但不在 fs2 的元素symmetric_difference()^对称差fs1.symmetric_difference(fs2)仅在其中一个集合的元素issubset()是否为子集fs1.issubset(fs2)fs1 的所有元素是否都在 fs2 中issuperset()是否为超集fs1.issuperset(fs2)fs1 是否包含 fs2 的所有元素isdisjoint()无是否不相交fs1.isdisjoint(fs2)两个集合无交集返回 True2.datetime 模块datetime 模块是 Python 标准库中用于处理日期和时间的核心模块该模块支持从公元 1 年到 9999 年的日期范围精度可以达到微秒级2.1.主要类类名描述datetime包含日期和时间年、月、日、时、分、秒、微秒date只包含日期年、月、日time只包含时间时、分、秒、微秒、时区信息timedelta表示两个日期或时间之间的差值tzinfo时区信息的抽象基类timezonePython 3.2 新增实现tzinfo的简单时区类2.2.使用参考博客https://blog.csdn.net/tomatop/article/details/158915909?ops_request_miscrequest_idbiz_id102utm_termpython%E6%97%B6%E9%97%B4%E7%B1%BButm_mediumdistribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-158915909.142^v102^pc_search_result_base5spm1018.2226.3001.41873.字典字典以键值对的形式存储数据3.1.字典的特性无序性Python 3.7 字典保持插入顺序但本质上是无序集合可变性可以动态增删改元素键唯一性键必须唯一值可以重复值可为任意类型可重复键必须可哈希键必须是不可变类型字符串、数字、元组、frozenset等3.2.基础操作1和1.0被视作同一个键键相同时后面的键值对会覆盖前面的键值对方法/操作语法描述示例创建字典d {}d dict()创建空字典{a: 1}访问值d[key]获取键对应的值键不存在抛出 KeyErrord[name]安全访问d.get(key, default)获取值键不存在返回默认值Noned.get(age, 0)设置默认值d.setdefault(key, default)键存在返回值不存在则设置并返回默认值Noned.setdefault(count, 0)添加/修改d[key] value添加或更新键值对d[age] 25删除键del d[key]删除指定键键不存在抛出 KeyErrordel d[age]删除并返回d.pop(key, default)删除键并返回值键不存在返回默认值None未设置默认值且键不存在则抛出异常value d.pop(age, 0)删除最后一项d.popitem()删除并返回最后插入的键值对字典为空时调用会抛出异常k, v d.popitem()清空字典d.clear()删除所有键值对d.clear()3.3.视图和遍历方法/操作语法描述示例获取所有键d.keys()返回所有键的视图对象for k in d.keys():获取所有值d.values()返回所有值的视图对象for v in d.values():获取键值对d.items()返回所有键值对的视图对象for k, v in d.items():长度len(d)返回键值对数量count len(d)成员检查key in d检查键是否存在if name in d:成员检查值value in d.values()检查值是否存在if 25 in d.values():视图对象视图对象是Python中一种动态的、只读的集合-like对象它不复制数据而是直接引用原字典的内部数据特点1动态更新视图对象会实时反映原字典的变化d {a: 1, b: 2} keys d.keys() print(keys) # dict_keys([a, b]) # 修改原字典 d[c] 3 print(keys) # dict_keys([a, b, c]) ← 自动更新了2支持集合操作dict_keys 和 dict_items 支持高效的集合运算d1 {a: 1, b: 2, c: 3} d2 {b: 2, c: 3, d: 4} # 交集共同键 common_keys d1.keys() d2.keys() # {b, c} # 差集d1有但d2没有 diff_keys d1.keys() - d2.keys() # {a} # 并集 union_keys d1.keys() | d2.keys() # {a, b, c, d}3可迭代可以直接用于循环无需转换成列表d {name: Alice, age: 25} # 直接迭代视图对象高效 for k in d.keys(): print(k) # 不需要写for k in list(d.keys())3.4.字典操作方法/操作语法描述示例合并更新原地修改返回Noned.update(other_dict)用另一个字典更新当前字典覆盖原有键d.update({age: 26})合并Python 3.5{**d1, **d2}合并两个字典返回新字典merged {**d1, **d2}合并Python 3.9d1 | d2合并返回新字典merged d1 | d2原地合并3.9d1 | d2将 d2 合并到 d1d1 | d2浅拷贝d.copy()返回字典的浅拷贝d2 d1.copy()浅拷贝dict(d)通过构造函数拷贝d2 dict(d1)深拷贝copy.deepcopy(d)返回字典的深拷贝import copy; d2 copy.deepcopy(d1)d.update(other)中的other是可迭代对象以下皆可字典元素是成对出现的元组的列表zip以及类似于关键字创建字典的方式str(dict)即 字典字面值3.5.创建和转换方法/操作语法描述示例从键创建dict.fromkeys(seq, value)从序列创建字典值默认为 Nonedict.fromkeys([a,b], 0)字典推导式{k: v for ...}使用推导式创建字典{x: x**2 for x in range(5)}列表转字典dict(zip(keys, values))两个列表组合成字典dict(zip([a,b], [1,2]))defaultdictdefaultdict(default_factory)带默认值的字典from collections import defaultdictOrderedDictOrderedDict()有序字典已内置顺序from collections import OrderedDictCounterCounter(iterable)计数器字典from collections import Counter键值名赋值创建mydict3 dict (name 张三, age 19genderM)包含两个元素的序列创建mydict3 dict([(name, 张三(age’19(gender’M)])二元创建my_dict4 dict([(name,张三),(age,19),(gender,M)])3.6.字典比较操作描述示例d1 d2比较两个字典是否相等{a:1} {a:1}→Trued1 ! d2比较两个字典是否不等{a:1} ! {b:2}→True3.7.字典排序输出场景方法示例返回值类型按键排序sorted(d.items())sorted({b:2, a:1}.items())→[(a,1), (b,2)]元组列表按键降序sorted(d.items(), reverseTrue)sorted({a:1, b:2}.items(), reverseTrue)→[(b,2), (a,1)]元组列表按值排序sorted(d.items(), keylambda x: x[1])sorted({a:3, b:1}.items(), keylambda x: x[1])→[(b,1), (a,3)]元组列表按值降序sorted(d.items(), keylambda x: x[1], reverseTrue)sorted({a:3, b:1}.items(), keylambda x: x[1], reverseTrue)→[(a,3), (b,1)]元组列表只要排序后的键sorted(d)或sorted(d.keys())sorted({b:2, a:1})→[a,b]列表只要排序后的值sorted(d.values())sorted({a:3, b:1}.values())→[1, 3]列表转回字典dict(sorted(d.items(), keylambda x: x[1]))用按值排序的结果构造新字典字典3.8.常用模式速查场景代码示例安全获取值value d.get(key, default)计数统计count d.get(key, 0) 1或使用Counter分组groups[key].append(value)配合defaultdict(list)交换键值{v: k for k, v in d.items()}过滤字典{k: v for k, v in d.items() if condition}默认字典from collections import defaultdictd defaultdict(int)带默认值的 getd {}\nd[new] d.get(new, 0) 1安全删除value d.pop(key, None)合并字典{**d1, **d2}或d1 | d2(3.9)列表转字典dict(zip(key_list, value_list))
返回列表