当前位置: 首页 > 后端技术 > Python

高效利用Python内置数据结构

时间:2023-03-26 01:49:05 Python

0x00:创建一键多值字典字典是Python中的变量容器,通常是这样的形式:d={key1:value1,key2:value2,key3:value3}Python并没有指定字典中值的类型,所以如果想要字典中的一个键对应多个值,只需将这些值放在一个容器如列表中即可。student={'a':[76,54,82],'b':[92,67,88]}为了便于创建此类词典,可以使用collections模块中的defaultdict类。一般访问字典中不存在的key会报错,defaultdict类会自动初始化一个默认值。使用defaultdict创建一个值为列表的字典:d=defaultdict(list)d['a'].append(1)d['a'].append(2)d['a'].append(3)0x01:OrdereddictionaryPython中字典的key是不记录顺序的。如果我们想在迭代或序列化字典时掌握元素的顺序,可以使用collections模块中的OrderedDict类。>>>从集合导入OrderedDict>>>d=OrderedDict()>>>d['a']=1>>>d['b']=2>>>d['c']=3>>>forkeyind:...print(key,d[key])...a1b2c3OrderedDict内部维护一个双向链表,每当在字典中创建一个新元素时,它就会被放在末尾链表的。重新分配现有密钥不会更改密钥的顺序。由于OrderedDict创建了一个额外的链表,因此它比普通字典占用更多空间。使用此类时要注意取舍。0x02:对序列进行去重,保持顺序不变。要删除列表中的重复项,您只需要使用set()。set创建一个没有重复的集合,你可以对其进行交集和并集等操作。但是,此类集合对象是无序的。>>>a=[1,4,6,1,2,1,3,6,2]>>>b=set(a)>>>b{1,2,3,4,6}如果你如果你想去除重复项并保持顺序,你可以通过在set()中添加一个生成器来解决它:defdedupe(items):seen=set()foriteminitems:ifiteminitems:ifitemnotinseen:yielditemseen.add(item)这只适用于序列中的元素是不可变对象,例如整数、字符串、元组。如果要应用于列表等变量容器,需要稍微修改一下代码:defdedupe(items):seen=set()foriteminitems:val=itemifkeyisNoneelsekey(item)ifvalnotinseen:yielditemseen.add(val)这里使用key参数指定一个函数,将序列中的元素转换为不可变类型。0x03:如何统计元素个数,找到一本书中出现频率最高的单词?或者,如果您想知道同一元素在列表中出现的次数,该怎么办?使用collections模块中的Counter类可以轻松完成此操作。>>>fromcollectionsimportCounter>>>words=['apple','keys','double','dude','eye','love','magic','double','magic','spell','apple','point','apple']>>>count=Counter(words)>>>countCounter({'apple':3,'double':2,'magic':2,'keys':1,'dude':1,'eye':1,'love':1,'spell':1,'point':1})也可以使用Counter类的most_common方法求top元素:>>>top=count.most_common(3)>>>print(top)[('apple',3),('double',2),('magic',2)]>>>另外,计数器对象也可以做数学运算:>>>words=['apple','keys','double','dude','eye','love','magic','double','magic','spell','apple','point','apple']>>>other=['apple','cool','duck','cookie']>>>a=Counter(words)>>>b=Counter(other)>>>aCounter({'apple':3,'double':2,'magic':2,'keys':1,'dude':1,'eye':1,'love':1,'spell':1,'point':1})>>>bCounter({'apple':1,'cool':1,'duck':1,'ccookie':1})>>>a+bCounter({'apple':4,'double':2,'magic':2,'keys':1,'dude':1,'eye':1,'love':1,'spell':1,'point':1,'cool':1,'duck':1,'cookie':1})>>>计数器类可以帮助我们很好的分析数据Do统计,当然,如果你是做算法题,请不要用它来作弊0x04:字典理解如果你想创建一个字典的子集,你可以使用字典理解来轻松完成。是的,列表有列表推导式,字典有字典推导式。>>>students={'a':98,'b':45,'c':73,'d':59}>>>passed={key:valueforkey,valueinstudents.items()ifvalue>=60}>>>passed{'a':98,'c':73}>>>看,我们通过一个包含所有学生成绩的字典,很容易得到通过的学生的成绩。