分类 编程天地 下的文章 - vwo50博客站,记录成长,分享有趣
首页
留言面板
友情链接
统计页面
4K壁纸
推荐
我的公众号
我的工具站
网址缩短站
电商优惠券
搜 索
1
青龙搭建美团外卖脚本,领外卖券图文教学~
1,313 阅读
2
免费虚拟主机,搭建自己的博客网站!(图文教学)
730 阅读
3
openclash的卸载和安装
631 阅读
4
申请甲骨文免费vps的流程
429 阅读
5
青龙从0到1搭建以及使用过程,实现JD自动签到、领豆。
379 阅读
生活随笔
技术相关
资源获取
VPS相关
编程天地
Leetcode
登录
/
注册
搜 索
标签搜索
Python
linux
Nginx
chatgpt
AI
开源
docker
grafana
跳过广告
RSS
AI绘画
WordPress部署
青龙
WinMemoryCleaner
oracle
vps
shell
youtube
服务器
sysstat
huolong
累计撰写
235
篇文章
累计收到
93
条评论
首页
栏目
生活随笔
技术相关
资源获取
VPS相关
编程天地
Leetcode
页面
留言面板
友情链接
统计页面
4K壁纸
推荐
我的公众号
我的工具站
网址缩短站
电商优惠券
用户登录
登录
注册
找到
13
篇与
编程天地
相关的结果
2023-10-24
Python学习记录14-对不支持排序的原生对象进行比较
本节的内容是我们要比较2个类型相同的对象,但是他们并不支持原生的比较操作。所以就需要我们来指定要比较的条件来进行排序。 我们直接上代码from operator import attrgetter class People: def __init__(self,uid): self.uid = uid def __repr__(self): return f'我是people' users = [People(35),People(18),People(23)] #print(sorted(users)) # 直接报错 TypeError: '<' not supported between instances of 'People' and 'People' print(sorted(users,key=attrgetter('uid'))) #[我是people18, 我是people23, 我是people35] print(sorted(users,key=lambda u:u.uid)) #也可以这样使用lambda匿名函数来写。但是使用attrgetter性能更好一些。在以上代码,声明了一个people类。 然后我们新建了一个users的列表,里面存放着3个people对象以及他们各自的uid,我们想通过uid进行比较。 直接进行sorted就会报错。 这个时候我们就可以使用operator的attrgetter了 ,和上一节的itemgetter非常像。 同理它也支持允许多个字段进行比较,也同样适用于min和max函数 print(min(users,key=attrgetter('uid'))) # 我是people18 print(max(users,key=attrgetter('uid'))) #我是people35
2023年10月24日
7 阅读
0 评论
0 点赞
2023-10-24
Python学习记录13-通过某个关键字排序一个字典列表
本期的内容是有一个字典列表, 我想通过里面指定字典的一个key进行对这个字典列表进行排序。假设有以下的字典列表,我们想通过对这个列表里的字典的特定key来进行排序,可以使用operator的itemgetter来轻松实现。以下是根据fname和uid排序的代码:from operator import itemgetter rows = [ , , , ] sortByFname = sorted(rows,key=itemgetter('fname')) print(sortByFname) #[, , , ] sortByUid=sorted(rows,key=itemgetter('uid')) print(sortByUid) #[, , , ]itemgetter() 函数也支持多个 keys,比如下面的代码rows_by_lfname = sorted(rows, key=itemgetter('lname','fname')) print(rows_by_lfname) #[, , , ] itemgetter() 有时候也可以用 lambda 表达式代替,比如:rows_by_fname = sorted(rows, key=lambda r: r['fname'])当然了这个函数还可以用于max和min。 t1 = min(rows, key=itemgetter('uid')) t2 =max(rows, key=itemgetter('uid')) print(t1) # print(t2) #
2023年10月24日
3 阅读
0 评论
0 点赞
2023-10-20
Python学习记录12-序列中出现次数最多的元素
本节的内容是获取一个序列中出现次数最多的元素,这个问题应该经常见,甚至有的面试题里也会考。 我们直接开始。有个列表list1,我们要从中获取出现次数最多的word。list1 = [ 'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes', 'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around', 'the', 'eyes', "don't", 'look', 'around', 'the', 'eyes', 'look', 'into', 'my', 'eyes', "you're", 'under' ] tmp = dict() for word in list1: if word in tmp.keys(): tmp[word] +=1 else: tmp[word] = 1 maxValue = max(tmp.values()) #8 result = [k for k,v in tmp.items() if v==maxValue] print(result) #['eyes'] 如果我们自己实现,那么需要借助字典的特性,将word和对应的次数形成键值对。最后再从字典里获取最大的value(即出现次数最多的),再通过获取对应的key来实现,听着就有点走弯路的样子。在Python里,我们就可以使用collections.Counter类来处理这种场景。可以使用它的most_common来帮我们实现,也就是说我们可以这样来写。word_counts = Counter(list1) top_three = word_counts.most_common(3) print(top_three) #[('eyes', 8), ('the', 5), ('look', 4)] #top_three 即返回前3,和后面most_common参数一致即可。 #本质上word_counts就是一个字典 print(word_counts['under']) #1 print(word_counts['eyes'])#8 print(word_counts['my']) #3Counter 实例一个鲜为人知的特性是它们可以很容易的跟数学运算操作相结合list1=['hh','aa','cc','aa','aa'] list2=['hh','hh','hh','aa','aa'] a = Counter(list1) b = Counter(list2) print(a) #Counter() print(b) #Counter() print(a+b) #Counter() print(a-b) #Counter()所以,以后再遇到类似的场景时候,就可以使用Counter啦。
2023年10月20日
5 阅读
0 评论
0 点赞
2023-10-19
Python学习记录11-命名切片
本节的内容是命名切片。也就是给切片进行命名。有以下场景。假设你的代码要处理的内容包含了大量无法清晰明了的硬编码切片,你想从中获取某个固定位置的字段或者值并且想简化代码的格式。你要怎么处理。话不多说,我们直接看代码示例 x = 'hausdjkxkvjxcjkvxcjkvtestxhu6ssfsfsasf6hu11' print(x[21:25]) #test print(x[39:41]) #hu name = x[39:41]+(x[21:25]) print(name) #hutest我想将字符串里的x里的test 和 hu提出来,并且让他们组合成一个name的名字。hutest。 以上代码虽然也没有问题,但是在可阅读性上不太好。此时我们就可以使用命名切片了。 fname = slice(39, 41) lname = slice(21,25) fullname = x[fname] + x[lname] print(fullname) #hutest我们通过声明fname 和 lname2 个 slice对象不但可以满足上述需求,也可以让我们的代码更加的清晰和增加阅读性和可维护性。这样使得在任何可以切片的地方就可以使用这2个对象来进行切片。比如:list1 = [1,2,3,4,5,6] a = slice(2,3,1) #最后一个参数是步数,可以不写,此处只是为演示 print(list1[a]) #切片结果:3 del list1[a] print(list1) #[1, 2, 4, 5, 6] print(a.start) #2 起始位置 print(a.stop) #3 结束位置 print(a.step) #1 步数
2023年10月19日
4 阅读
0 评论
0 点赞
2023-10-18
Python学习记录10-删除序列相同元素并保持顺序
本节的内容是怎样在一个序列上面保持元素顺序的同时消除重复的值?如果我们想消除一个队列里的重复元素,那么可以利用集合的特性来实现,比如以下代码,但是这样的代价是重复的元素去掉了。但是列表里的元素不是按顺序排列了。 请注意set会自动排序,我这里期望的顺序是3,1,2,23 按照元素的先来后到展示。a = [3,1,1,2,3,1,1,23] print(set(a)) #如果要是保持顺序且消除重复元素,我们可以使用以下代码来实现:def unq(items): list1 = list() for item in items: if item not in list1: list1.append(item) else:continue return list1 print(unq(a)) #[3, 1, 2, 23]新的场景来了,比如我的是一个字典列表,且里面有重复的字典,那么用上面的代码也是可以胜任的def unq(items): list1 = list() for item in items: if item not in list1: list1.append(item) else:continue return list1 a = [, , , ] print(unq(a)) #[, , ] 如果你想在排列去重的时候,按照顺序排列,那么可以利用set的特性,我们将上面代码的list换成set即可。
2023年10月18日
10 阅读
0 评论
0 点赞
2023-10-09
Python学习记录09-查找两个字典的相同点
本节的内容是查找2个字典所拥有的共同元素。比如说。2个字典拥有的相同的key 。或者2个字典所拥有的相同的key,value。以下有2个字典,内容是:d1 = { "A":"a", "B":"b", "C":"cc" } d2 ={ "AA": "a", "BB": "b", "C": "cc" }找出他们共同的key,可以使用在2个字典的keys上执行集合操作print(d1.keys() & d2.keys()) # 输出内容是找出d1存在的key,但是在d2不存在的keyprint(d1.keys()-d2.keys()) # 输出内容是 找出双方都有的键值对print(d1.items() & d2.items()) #输出内容是 : ,若没有共同的key,value,则输出一个set利用以上的交、差运算可以用于修改或者过滤字典元素,来形成一个新的字典d3 = } print(d3) #输出为
2023年10月09日
11 阅读
0 评论
0 点赞
2023-09-06
Python学习记录07-字典排序
本文的内容是对字典进行排序。Python 的字典中本身是无序的,没有这个说法的。常见的我们对字典进行排序,一般有通过sorted函数,用key来排序,或者是通过value来排序,以下是示例的代码。d1 = d1['cat '] = 9 d1['dog '] = 6 d1['fish '] = 3 d1['bird '] = 1 print(sorted(d1.keys())) #用key排序 ['bird ', 'cat ', 'dog ', 'fish '] print(sorted(d1.items(),key=lambda item:item[1])) #用value排序 [('bird ', 1), ('fish ', 3), ('dog ', 6), ('cat ', 9)] 当我们创建一个字典,并且在迭代或序列化这个字典的时候能够控制元素的顺序,我们可以使用collections里的OrderedDict类,来实现。 它会按照元素被插入时候的顺序来进行排序。d = OrderedDict() d['cat '] = 9 d['dog '] = 6 d['fish '] = 3 d['bird '] = 1 print(d) # OrderedDict([('cat ', 9), ('dog ', 6), ('fish ', 3), ('bird ', 1)]) 构建一个将来需要序列化或编码成其他格式的映射的时候, OrderedDict 是非常有用的。 比如,你想精确控制以 JSON 编码后字段的顺序,你可以先使用 OrderedDict 来构建这样的数据。json.dumps(d) ''注意点:1、OrderedDict 内部维护着一个根据键插入顺序排序的双向链表。每次当一个新的元素插入进来的时候, 它会被放到链表的尾部。对于一个已经存在的键的重复赋值不会改变键的顺序。2、一个 OrderedDict 的大小是一个普通字典的两倍,因为它内部维护着另外一个链表。 所以如果你要构建一个需要大量 OrderedDict 实例的数据结构的时候。对内存资源的占用较高,请谨慎考虑
2023年09月06日
16 阅读
0 评论
0 点赞
2023-09-06
Python学习记录06-字典中的键映射多个值
本节的内容是Python中的字典,一个key映射多个value的内容。 Python的基础知识学习里,我们常用的字典是这样的。 都是一个key映射一个valuedict1 = print(dict1) print(dict1["hello"]) #world print(dict1["nihao"]) #shijie如果想一个key映射多个value, 我们就需要让value也是一个容器,可以是列表,也可以集合。看具体的使用场景。列表的特性是可以保持顺序,集合的特性是可以去重。可以用以下的方式来创建一个映射多个value 的字典test1 = { "key1":['value1','value','value3'], "key2": } print(test1) #}如果想添加元素,则可以使用。append和add 。注意是列表用append,set用add。set没有append方法,如果用它就会报错。test1["key1"].append('value7') test1["key2"].add('value8') print(test1) #}写的时候有些许麻烦,我们可以使用collections里的defaultdict来快速简单的创建这样的字典。我们只关注添加元素即可,若果对应的key不存在,则会自动帮我们创建的from collections import defaultdict d = defaultdict(list) d['a'].append(1) d['a'].append(3) d['a'].append(5) print(d) #defaultdict(<class 'list'>, ) s = defaultdict(set) s['b'].add(4) s['b'].add(5) s['b'].add(6) print(s) #defaultdict(<class 'set'>, }) 接下来我们来尝试实现一个多值映射的字典,可以使用test1= d = for key,value in test1.items(): if key not in d : d[key]=[] d[key].append(value) print(d)如果使用defaultdict,则会更简单test1= d = defaultdict(list) for k,v in test1.items(): d[k] = v print(d)
2023年09月06日
3 阅读
0 评论
0 点赞
2023-09-05
Python学习记录05-实现一个优先级队列
本节的内容是要实现一个优先级队列,并且当这个队列进行POP操作的时候,总是先弹出优先级最高的元素。今天我们就跟着文档一起学习一下。文档使用了heapq模块来实现了一个优先级队列,我们由简到繁。来慢慢分析。这里先定义一个一会要按优先级排序的 Item。然后用它的2个对象进行比较,发现是会报错的。因为不支持比较。class Item: def __init__(self,name): self.name = name def __repr__(self): return 'Item()'.format(self.name) if __name__ == '__main__': aa = Item('cat') bb = Item('dog') print( aa < bb) #TypeError: '<' not supported between instances of 'Item' and 'Item' 我们非要给这个Item对象排序的话,可以用元组。 aa = (5,Item('cat')) bb = (4,Item('cat')) print( aa > bb) #输出为True但是只用元组的第一个元素进行优先级比较的话,只适用于优先级不同的场景,如果优先级。如果优先级一样,则也会抛出 typeerror的异常。bb = (4,Item('cat')) cc = (4,Item('fish')) print(bb < cc) #TypeError: '<' not supported between instances of 'Item' and 'Item'那为了避免这种场景,我们就需要在元组的第二个位置再引入一个元素inex,且让index的元素始终是不一样的,这样就优先级相同也不会报错,优先级不同index也不会有影响。 !!Python 在做元组比较时候,如果前面的比较已经可以确定结果了, 后面的比较操作就不会发生了 bb = (4,0,Item('cat')) cc = (4,1,Item('fish')) print(bb<cc) #True 此时不报错了,因为有了,0,1 index来做比较了接下来我们看另一个例子,我在这里定义了一个堆,然后通过heapq的push方法往里添加元组元素,然后再输出heap 和pop。 根据print那行可以得知,默认堆是从低优先级到高优先级排序的,pop每次是弹出最左边的元素。因为最左边的是最小的。这就是小顶堆。也就是小的元素在 堆顶,每次把堆顶的弹出去,然后再维持堆的形状。 heap = [] heapq.heappush(heap,(1,'111')) heapq.heappush(heap,(0,'222')) heapq.heappush(heap,(3,'333')) heapq.heappush(heap,(2,'444')) print(heap) #[(0, '222'), (1, '111'), (3, '333'), (2, '444')] print(heapq.heappop(heap)[-1]) #222 # print(heapq.heappop(heap)) # [(0, '222') # print(heapq.heappop(heap)) # (1, '111') # print(heapq.heappop(heap)) #(2, '444') # print(heapq.heappop(heap)) #(3, '333')我这里的需求是想每次pop,弹出最左边的元素,但是需要最左边的元素是最大的。这就需要我们在往里push 的时候,把优先级从高到低插入。也就是先插入优先级高的,在插入优先级低的,最后也就形成了大顶堆。所以这时候pop,弹出的就是最大的元素了。代码如下,只是需要把优先级改成负数即可。 heap = [] heapq.heappush(heap,(-1,'111')) heapq.heappush(heap,(0,'222')) heapq.heappush(heap,(-3,'333')) heapq.heappush(heap,(-2,'444')) print(heap) # [(-3, '333'), (-2, '444'), (-1, '111'), (0, '222')] print(heapq.heappop(heap)) #(-3, '333') print(heapq.heappop(heap)) # (-2, '444') print(heapq.heappop(heap)) #(-1, '111') print(heapq.heappop(heap)) # (0, '222')到这里我们有以下几个知识点元组比较时候,如果优先级相同则会报错,所以需要添加第二元素 index往堆里插入为了让最大堆元素最先弹出,所以优先级要反着来。单独的Item不能比较啰嗦了这么多,终于到了最后的用一个heapq来实现一个优先级队列,使得可以按照优先级,每次来pop出优先级最高的元素,完整代码如下import heapq class PriorityQueue: def __init__(self): self.queue = [] self.index = 0 def push(self,item,priority): heapq.heappush(self.queue,(-priority,self.index,item)) self.index += 1 def pop(self): return heapq.heappop(self.queue)[-1] class Item: def __init__(self,name): self.name = name def __repr__(self): return 'Item()'.format(self.name) if __name__ == '__main__': q = PriorityQueue() q.push(Item('dog'),1) q.push(Item('fish'),5) q.push(Item('cat'),3) q.push(Item('bird'),1) print(q.pop()) #Item('fish') print(q.pop()) #Item('cat') print(q.pop()) #Item('dog') print(q.pop()) #Item('bird')
2023年09月05日
10 阅读
0 评论
0 点赞
2023-08-30
Python学习记录04-查找最大或者最小的X个元素
在一个列表或者集合里,如果我们想要查找其中最大的值和最小的值。是比较简单的,我们可以使用min()函数和max()函数。如以下代码tlist = [1,20,-4,100] print("最大值:", max(tlist), "最小值:", min(tlist)) #最大值: 100 最小值: -4 tset = print("最大值:", max(tset), "最小值:", min(tset)) #最大值: 132 最小值: -1 那假如要查找这个列表或者集合里的最大的2个元素或者是最小的2个元素,此时应该怎么做呢 常规思路:把列表或者集合排序。然后获取有序列表(假设从小到大)的前2个和后2个就可以。tlist = [1,20,-4,100] print(sorted(tlist)[:2]) #[-4, 1] print(sorted(tlist)[-2:]) #[20, 100]到此本节内容的知识点来了,像类似的问题可以使用heapq模块来解决。我们来先打开官方的api文档查看介绍,只看最关键的2个方法就可以,一个是从数据集中返回n个最大的,一个是返回n个最小的。 https://docs.python.org/zh-cn/3/library/heapq.html 然后我们体验一下。发现使用这个heapq的2个方法就不需要我们先自己排序了,因为它的底层会对传入的可迭代对象进行堆排序。排序之后最小的是元素是第一个,也就是说是从小到大排列。import heapq tlist = [1322,1,20,-4,100,0] print(heapq.nlargest(2,tlist)) #最大的2个数,未指定key [1322, 100] print(heapq.nsmallest(2,tlist)) #最小的2个数,未指定key [-4, 0] tset = print(heapq.nlargest(2,tset)) #最大的2个数,未指定key [132, 99] print(heapq.nsmallest(2,tset)) #最小的2个数,未指定key [-1, 99] 这里说一下这2个方法的3个参数n:指的是返回的元素个数iterable :指的是可迭代的对象,其中包括列表,集合等key:对应要排序的键 ,等价于 sorted的key参数以下代码我们通过指定key,使得按照年龄来排序。也可以看出来当heapq的返回数量和长度一致时候,输出和sorted加key参数的输出也是一致的。students=[ ('hxd1',18), ('hxd100',14), ('hxd10086',15), ] big =heapq.nlargest(1,students,key=lambda s:s[1]) print(big) #[('hxd1', 18)] small =heapq.nsmallest(3,students,key=lambda s:s[1]) print(small) #[('hxd100', 14), ('hxd10086', 15), ('hxd1', 18)] test3 = sorted(students,key=lambda s:s[1]) #可以看到和heapq的key参数作用是一样的,输出也一样 print(test3) #[('hxd100', 14), ('hxd10086', 15), ('hxd1', 18)]heapq还有3个比较常用的函数,分别是heappush和heappop和heappushpop 。heappush :给堆里加元素heappop :把堆里最小的元素弹出heappushpop :给堆里加一个元素,并且把最小的弹出。官方文档的这个堆排序的示例就很不错:这节课的知识点总结:若获取列表或者集合里的单个最大或者最小的值。min 和max函数较好若获取列表或者集合里的X个最大或者最小的值。用heapq的2个方法较好若X的值比较大或者接近列表的长度,可以使用sorted排序之后,再切片。如果您觉得这篇文章对你有帮助,不妨给我点个赞,这将是我继续分享优质内容的动力。
2023年08月30日
7 阅读
0 评论
0 点赞
1
2