Python3实用编程技巧+案例

Python3实用编程技巧+案例

最近这几天为了给大家写几篇Python的文章,营长特意重新拾起了好久没玩的Python,给大家整理了Python常用的一些编程技巧。

下面就是几个常用的很简单的Python技巧,如果你还没了解过,建议收藏一下,希望你能学到这一波操作。

文末附上了一些新更新的Python学习资源哦~

一、如何在列表,字典,集合中根据条件筛选数据?

问题1:

如何过滤掉列表[3,9,-1,10,20,-2]中的负数?

解决方法:

在Python中可以使用函数式编程,列表解析,字典解析集合解析等方式进行筛选。

1)最通常的方法:迭代

data = [3,9,-1,10,20,-2]res = []for x in data: if(x >= 0): res.append(x)print(res)

2)使用filter函数

from random import randintdata = [randint(-10,10) for x in range(10)] #在-10到10之间随机生成10个随机数newdata = list(filter(lambda x: x >= 0, data))print(newdata) 

注意Python3中的filter函数返回的对象从列表改为了Iterator(迭代器),因此如果想返回一个列表,就要加上list()

3)列表解析

newdata2 = [x for x in data if x >= 0]print(newdata2)

结果和使用filter函数相同,但是使用列表解析所需的时间要比使用filter快很多,所以首选的方式就是列表解析,另外这两种方式都远快于迭代的方式。

问题2:

如何筛选出字典中值高于90的项?

解决方法:

from random import randintdic = {x: randint(60,100) for x in range(1,11)} #随机生成学号1到10的学生成绩newdic = {k:v for k,v in dic.items() if v >= 90} #同时迭代键和值,Python3中的iteritems变为itemsprint(newdic)

问题3:

如何筛选出集合{77,89,32,29,33}中能被3整除的元素?

解决方法:

s = {77,89,32,29,33}news = {x for x in s if x % 3 == 0}print(news)

二、如何为元组中的每个元素命名,提高程序的可读性?

实际案例:

如学生信息管理系统中数据为固定格式:

(名字,年龄,性别...)

学生数量很大,为了减少存储开销,对每个学生信息采用元组表示:

(‘jam’,16,’male’)

(‘tom’,18,’male’)

(‘july’,19,’female’)

...

访问元组时,需要使用索引(index)来访问,

如一个学生元组为student = ('jam',19,'male'),那么想要访问其名字时要使用student[0],访问其性别时要使用student[2]

由此带来的问题是大量的索引会降低程序的可读性,

那么如何来解决这个问题呢?

有两种解决方案

方案1:定义枚举类型,也就是定义一系列数值常量

NAME = 0AGE = 1SEX = 2# NAME,AGE,SEX = range(1,4)student = ('jam',19,'male')print(student[NAME])print(student[AGE])

方案2:使用标准库中collections.namedtuple替代内置的tuple

from collections import namedtupleStudent = namedtuple('student',['name','age','sex']) #相当于创建了一个命名元组类,第一个参数是元组的名字,第二个参数是其属性s1 = Student('jam',18,'male') #可以直接传参s2 = Student(name='tom',age=20,sex='male') #也可以通过关键字传参print(s1.name) #通过属性来访问print(s2.age)

三、如何统计序列中元素的出现频度?

问题1:

某随机序列[12,5,6,4,6,5,5,7,...]中,找到出现次数最高的3个元素,它们出现次数是多少?

解决方法:

统计元素出现的次数

from random import randintdata = [randint(1,10) for x in range(30)] # 随机生成30个1到10之间的数字# 为了方便地统计每个元素的频率,可以使用字典# 初始构造一个字典,键是1到10,对应的初始值设为0c = dict.fromkeys(data,0) # {6: 0, 1: 0, 4: 0, 10: 0, 2: 0, 8: 0, 5: 0, 7: 0, 3: 0, 9: 0}# 然后遍历data中的每个值,对应的键值加1即可for x in data: c[x] += 1print(c) # {10: 5, 1: 3, 4: 1, 7: 5, 8: 4, 6: 5, 2: 2, 9: 3, 3: 2} 

为了找出出现次数最高的三个元素,可以使用collections.Counter对象,将序列传入Counter的构造器,得到Counter对象是元素频率的字典。Counter.most_common(n)方法得到频率最高的n个元素的列表。

from random import randintfrom collections import Counterdata = [randint(1,10) for x in range(30)]c2 = Counter(data) #直接将data传入Counter构造器print(c2) #c2就是每个元素的频率的字典print(c2[10]) #得到数字10出现的频率#输出出现频率最高的3个元素print(c2.most_common(3)) # [(6, 6), (10, 5), (1, 4)]

问题2:

对某英文文章的单词进行词频统计,找到出现次数最高的3个单词?

import refrom collections import Countertxt = '''In the entire would there is nobody like me.Since the beginning of time,there has never been another person like me.Nobody has my smile.Nobody has my eyes,my nose,my hair,my hands,or my voice.I am special'''c3 = Counter(re.split('\W+',txt)) # 以非单词进行分割,统计出每个单词的频率print(c3)print(c3.most_common(3)) # 输出频率最高的3个单词

四、如何根据字典中值的大小,对字典中的项进行排序?

案例:

某班英语成绩以字典形式存储为:

{‘LiLei’:79,’Jim’:88,’Lucy’:92...}

要根据成绩高低,计算学生排名

解决方法:

使用Python的内置函数sorted进行排序,sorted函数通常用于对列表的排序,如sorted([2,1,5,9,3])

若对字典进行排序可先利用zip将字典数据转化为元组在进行排序。

from random import randintdata = {x : randint(60,100) for x in 'abcxyz'} # 随机生成一个学生成绩的字典newdata = list(zip(data.values(),data.keys())) # 将成绩放在前面便于sorted排序,先比较成绩,成绩相同时在比较键值print(newdata) # [(72, 'a'), (82, 'b'), (86, 'c'), (88, 'x'), (97, 'y'), (81, 'z')]print(sorted(newdata)) # [(72, 'a'), (81, 'z'), (82, 'b'), (86, 'c'), (88, 'x'), (97, 'y')]

第二种方式可以通过传递sorted函数的key参数进行排序

from random import randintdata = {x : randint(60,100) for x in 'abcxyz'} # 随机生成一个学生成绩的字典newdata = sorted(data.items(),key=lambda x: x[1]) # key的参数是一个函数,每次迭代data.items(),将每一项作为函数的参数,结果返回每一项的value值作为用于排序的key值print(newdata)

好啦,由于时间有限,今天暂时先给大家分享这几个技巧,如果大家喜欢的话,后面我还会再整理分享一期,敬请关注!

写在最后

Python3实用编程技巧+案例


分享到:


相關文章: