You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
# set 集合 fronzenset (不可变集合) 无序, 不重复# s = set('abcdee')# s = set(['a','b','c','d','e'])s= {'a','b', 'c'}
# s = frozenset("abcde") # frozenset 可以作为 dict 的 key# | & - #集合运算another_set=set("cef")
re_set=s.difference(another_set)
re_set=s-another_setre_set=s&another_setre_set=s|another_set# set 性能很高print(re_set)
print (s.issubset(re_set))
# if "c" in re_set:# print ("i am in set")
This discussion was converted from issue #19 on June 09, 2023 03:08.
Heading
Bold
Italic
Quote
Code
Link
Numbered list
Unordered list
Task list
Attach files
Mention
Reference
Menu
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
当初能快速上手 Python 最重要的一点是其内置的数据结构非常强大,关于数据类型的差别作为基础的知识点在其他教程中已经有非常详细的介绍,所以这里就不再赘述了。
这次主要分享一些能提升开发效率的使用心得。
按特性对 Python 集合容器分类:
容器序列:list,tuple,deque(可存放任意类型)
扁平序列:str,bytes,bytearray,array.array(可for循环遍历,存放单一类型)
可变序列:list,deque,bytearray,array
不可变序列:str,tuple,bytes
有序结构
频繁插入操作
在频繁插入数据、同时要求有序的场合,使用 bisect、collections.deque 效率比较高。
array、deque
性能比 list 高很多(存储在一段连续的内存空间),但只能接收单一类型元素,在某些场景下比 list 更适用。
自定义序列类
如要自己实现一个具备某种功能的类,应该实现其功能对应的魔术方法:
无序结构
dict
dict 属于 MutableMapping 类型(可修改映射),查看源码:
常用方法:
子类
不建议继承 list 和 dict(这些是使用 C 实现的数据结构,可能不会执行继承后覆盖的父类方法);
如要扩展 dict 功能,可继承 collections.UserDict。
Set
常用方法:
性能测试:
应用:从列表、字典、集合筛选数据
列表生成式是一种很 Pythonic 的用法:
仅一行代码就能从 可迭代对象data 中筛选出满足大于等于0条件的元素。它的迭代器版本为:
区别在于返回的是一个满足筛选条件的 迭代器,当遍历时元素在当前循环中才产生所以能大量节省内存,但定义后只能使用一次。
其实字典和集合也可以使用推导式:
返回的是 经过筛选的字典/集合,比使用 for 循环要简单直接得多。
应用:为元组元素命名
有 C/C++ 开发经验的朋友常常会用到:
我想说的是这里用到一种为元素命名的方法,直接通过名称能在顺序结构中以更快的速度访问元素(而不需要遍历整个对象)。
在Python中也可以通过名称(而不是下标)的方法访问列表/元组元素:
例如可以自己 定义“枚举类型”:
另外也可以使用 collections 模块的 namedtuple:
以上两种方法都可以实现通过名称访问元组/列表的元素哦~
应用:统计序列中元素的出现频度
有时需要统计列表/元组中某些元素出现的次数。
其中一种方法是使用字典来统计:
这个时候更方便的方法是使用collections的Counter类型:
这时候返回的是一个计数器对象,可以使用 dict 直接转换为以元素为 key、次数为 value 的字典。
而且还可以直接取出出现次数排名前三的元素,并组成新的字典:
应用:把字典根据值的大小排序
字典也是可以排序、达到按序查找的效果:
对于一个随机的字典:
排序的方法是转化为一个元组列表,再对元组的项排序:
更好的方法是利用sorted函数的第二个参数指定参与排序的项:
应用:找到多个字典中的公共键
假设有多个字典,需要找到这些字典中都存在的 key:
可见公共键就是 "a",但在比较大的字典中要迅速找到这个公共键,常见的方法是构造循环遍历 di_a,并在循环中判断di_a的键是否同时存在于 di_b 和 di_c......
有一种更简便的方法:
di_a.viewkeys()
返回的是一个 view 对象,可以直接转化为存放字典 di_a 的列表,最重要的优点是 view 对象是支持集合运算的,上面这个语句返回的是同时存在于 di_a、di_b、di_c 中的元素(交集)的集合,即三个字典的公共键集合:应用:让字典保持有序
使用字典有时会碰上一种情景,要求让字典一直保持有序(例如比赛中统计名次和成绩),这时候使用 collections 的 OrderDict 类型就非常方便了,以下是一个模拟比赛的程序:
应用:实现用户的历史记录功能(最多 n 条)
很多时候需要让程序实现自动记录用户的历史数据和操作,达到缓存的效果(例如浏览器的搜索记录等)。
Python 的 collections 模块提供了双向队列,可以很方便的实现这个功能,以下是一个猜数游戏(用户每次输入数字,返回答案的取值范围,随着输入次数增多范围缩小,当用户输入与答案相同的数字时游戏结束):
但有时随着输入的次数增多,就很容易忘记之前已经输入过的数字,这时候可以引入一个存放历史记录的队列:
Beta Was this translation helpful? Give feedback.
All reactions