我的Python学习笔记(一)

本文分享了Python编程中的实用技巧,包括列表、字典等数据结构的操作方法,如使用列表解析、字典解析及集合解析简化数据筛选流程。同时介绍了如何利用Python标准库中的Counter类和namedtuple简化词频统计及元组的属性访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常上网看一些技术博客,听到很多人说多写博客对学习很有帮助,虽然我基本上没有做笔记或者写东西的习惯,但我还是想,写写试试看,从基础慢慢写起吧!如果侥幸有人看见还学到了东西,想必是极好的了。
那么我就先写写,我在python开发过程中,一些小tip吧
python中最常见的几种数据结构,列表,字典,集合,元组等。想要用好python是避免不了与这几种类型打交道的。首先,使用这些类型最常见的操作,是要筛选数据,比如说过滤掉列表中的负数,过滤掉成绩表中不及格的人等等应用场景是很常见的,我操作过程中,用到的tips有这些:
先看这样一个列表`a=[1,4,10,50,327,-10,-20],如果要过滤到当中的负数,最直观的办法,就是迭代:

b=[]
for x in a:
    if x >0:
    b.append(x)

但是对于python来说,这样做,显的有些繁琐了,我们有列表解析式,对于上述问题,一行代码就解决了:

[for x in a if x>=0]

当然,还有filter函数对于过滤数据也是很好用的,filter函数接收两个参数,一个过滤函数,以及要过滤的数据本身,对于上述问题,也是一行代码的事情:

a=filter(lambda x:x>=0,data)

对于字典呢,字典解析稍有不同,考虑这样一组数据 :
Score={"T-mac":50,"Kobe":51,"James":43,"Durant":19}
现在我们要过滤掉得分低于20分的球员,如果像列表解析:

{for players in Score if players >60}

上面是行不通的,因为字典默认迭代它的key而不是他的value,解决上面的办法就是利用字典对象的items()方法,这个方法,就是把这个字典本身变成一个列表,列表中的每个元素就是包含每一个键值对的元组,调用Score.items()后,Score变成这样:

[('Durant', 19), ('James', 43), ('T-mac', 50), ('Kobe', 51)]

然后,我们就可以利用字典解析了:

{k:v for k ,v in Score.items() if v >20}

这样,低于20分的人,就被过滤掉了。
至于集合的解析,与列表解析类似,就不赘述了。
对于元组,我理解的每一个元组,就是一条数据,比如

Coolboy=('xiaoyu',18,'male')

现在我要访问这个元组中的每一项,只有依赖于索引,像这样Coolboy[1]这显然不太合理,合理的应该是这样访问

Coolboy[Name]

要想做到这样访问,一种办法就是搞一个Name变量与其索引对应呗,另一种办法就是利用collections下的namedtuple,顾名思义,命名元组,
就像这样用:

man=namedtuple('man',['name','age','sex'])

需要向namedtuple的构造函数传递这样两个参数,一个是这个元组的名字,另一个是这个元组每一个元素的属性列表。

Coolboy=man('xiaoyu',12,'male')

这样就产生了一个Coolboy命名元组,我们也可以利用Coolboy[name]这种属性的访问方式来访问元组中的每一个元素了,写出来的代码,也更具有可读性。
前几天看了看吴军博士的《数学之美》,里面讲到了自然语言处理,其中便有词频统计这个概念,试想我们现在有一篇文章需要我们做词频统计,那么用python怎么做呢?
最直观的想法还是先把这篇文章进行分割,写个循环,进行遍历统计。
当然这样可以解决问题,但是对于python来说,这种办法,依然有些多余,在collections库下面,有一个Counter类,利用它,整个过程不要太简单哦。
假设我们已经把这篇文章分割好了

Article=["wo","ni","wo","ta","tamen","wo","women"]

Counter类实例化时接收一个可迭代的对象:count=Counter(Article)

print(count)
#结果为
Counter({'wo': 3, 'women': 1, 'tamen': 1, 'ta': 1, 'ni': 1})
#一个包含词汇以及频率的字典

还是词频统计的问题,现在我们对每一篇文章的词频都要做统计,而且需要时刻看见统计过程中词频排名的变化,这就要求我们,这个字典要时刻保持有序,对于排序问题,用python内置的sorted的函数是相当合适的,但是应用于字典时,还是需要利用字典的items方法,这样才可以取出字典每个元素的value值,利用其进行排序。

Score={"T-mac":50,"Kobe":51,"James":43,"Durant":19}
sort=sorted(Score.items(),key=lambda x:x[1])
#上面的代码利用元组中后一个元素的值,进行排序
#结果为
[('Durant', 19), ('James', 43), ('T-mac', 50), ('Kobe', 51)]

最后再设想一个场景吧,咱们爬取了NBA每年得分排名前五的选手的姓名以及得分,现在我想看看,5年中谁的得分一直排在联盟前十。这怎么办呢,比如,数据是这样的:

s10={'a':2000,'b':1900,'c':1200,'d':1000,'f':900}
s9={'g':2000,'b':1900,'o':1200,'d':1000,'f':900}
s8={'z':2000,'p':1900,'c':1200,'d':1000,'s':900}
s7={'d':2000,'b':1900,'c':1200,'u':1000,'m':900}
s6={'a':2000,'y':1900,'c':1200,'d':1000,'f':900}

这个问题,就转换为求所有字典的公共键了。暴力的办法就是从第一个字典中取出每一个键,然后去和后面的字典对比,如果存在于每个字典中,那么这个键就被输出。对于python,依然有更快捷的解决办法。
python中dict对象有一个keys方法,返回一个类似集合的包含字典的keys的对象,对集合求交集,就可以完成上述需求,代码如下:
这里用到了一个reduce函数,这个函数接收一个函数以及一个可迭代对象,其功能就是每次取出这个可迭代对象中的相应数据,进行运算后,用运算后的结果再和取出的数据进行运算,比如我们上面的需求,就是s10与s9求交,获得的交集再与s8求交。

itersets=map(dict.keys,[s10,s9,s8,s6,s7])

intersect=reduce(lambda a,b:a&b, itersets)
#结果为
"d"

第一篇博文不好写啊,写到这里就算了,如果你觉得还有那么一点点用,点个订阅哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值