python高效编程技巧

python高效编程技巧

文章参考:公众号python菜鸟学Python编程
python 中有很多内置函数帮你提高工作效率
工作中经常要处理各种各样的数据,遇到项目赶进度的时候自己写函数容易浪费时间

一、根据条件在序列中筛选数据

1、假设有一个数字列表data,请过滤列表中的负数

使用列表推导式:

result = [i for i in data if i >=0]

使用 fliter 过滤函数

result = fliter(lambda x:x >=0,data)

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
注意: Pyhton2.7 返回列表,Python3.x 返回迭代器对象,具体内容可以查看:Python3 filter() 函数

语法
filter(function, iterable)
function – 判断函数。
iterable – 可迭代对象

lambda函数又称为匿名函数,匿名函数就是没有函数名的函数。
lambda x,y:x+y
x,y是函数的两个变量,位于冒号的左边,冒号右边的表达式是函数的返回值

2、学生的数学分数以字典形式存储,筛选其中分数大于80分的同学

d = {x:randint(50,100) for x in range(1,21)}
{1: 89, 2: 98, 3: 71, 4: 83, 5: 75, 6: 93, 7: 100, 8: 81, 9: 87, 10: 53, 11: 56, 12: 85, 13: 71, 14: 52, 15: 91, 16: 76, 17: 81, 18: 86, 19: 89, 20: 68}

{k:v for k,v in d.items() if v>80}
{1: 89, 2: 98, 4: 83, 6: 93, 7: 100, 8: 81, 9: 87, 12: 85, 15: 91, 17: 81, 18: 86, 19: 89}

randint(number,number):随机一个范围内的整数
dict_s.items():返回可遍历的(键, 值) 元组数组。
dict_s.keys():返回可遍历的 键 元组数组。
dict_s.value():返回可遍历的 值 元组数组。

二、对字典的键值对进行翻转

使用ZIP函数
ZIP()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表

from random import sample
s1 = {x: randint(1,4) for x in sample(‘abfcdrg’,randint(1,5))}
s1
{‘b’:1, ‘f’:4, ‘g’:3, ‘r’:1}

d = {k:v for k,v in zip(s1.values,s1.keys())}
d
{1:‘r’ ,4:‘f’, 3:‘g’}

sample(序列a,n)
功能:从序列a中随机抽取n个元素,并将n个元素生以list形式返回。

三、统计序列元素中元素出现的频率

1、某随机序列中,找到出现次数最高的3个元素,它们出现的次数是多少?

构造随机序列如下:

data = [randint(0,20) for _ in range(20)]

方法1:可以使用字典来统计,以列表中的数据为键,以出现的次数为值

from random import randint
def demo():
data = [randint(0,20) for _ in range(20)]
d = dict.fromkeys(data,0)
d
{10: 0, 4: 0, 3: 0, 8: 0, 19: 0, 11: 0, 7: 0, 5: 0, 20: 0, 15: 0, 0: 0, 12: 0}

for v in range(10):
d[v] += 1
return d

Python 字典 fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。
语法
fromkeys()方法语法:
dict.fromkeys(seq[, value])

方法2:直接用conllections模块下的Counter对象
在很多使用到dict和次数的场景下,Python中用Counter来实现会非常简洁,效率也会很高

data = [randint(0,20) for _ in range(20)]
data
[10, 7, 18, 2, 6, 2, 12, 18, 2, 11, 15, 1, 4, 15, 4, 9, 7, 14, 14, 11]

c2 = Counter(data)#以字典形式返回列表中元素出现的个数
c2
Counter({2: 3, 7: 2, 18: 2, 11: 2, 15: 2, 4: 2, 14: 2, 10: 1, 6: 1, 12: 1, 1: 1, 9: 1})

c2.most_common(3) #统计频率出现最高的3个数
[(2, 3), (7, 2), (18, 2)]

2、对某英文文章单词进行统计,找到出现次数最高的单词以及出现的次数

依然用上面提到的Counter来处理

total = re.split(’\W+’,text)#所有单词的列表
result = Counter(total)
print(result.most_common(10))

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

比如班级中学生的数学成绩以字典的形式存储

{“acc”:99, ‘bcc’:98…}

请按数学成绩从高到低进行排序
方法1:利用zip将字典转化成元组,在用sorted进行排序
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

data = sorted(zip(data.values(), data.keys()))

方法2:利用sorted函数的key参数

sorted(data.items(),key=lambda x:x[1])

五、在多个字典中找到公共的键

实际场景:在足球比赛中,统计每轮比赛都有进球的球员
模拟随机的进球球员和进球数

s1 = {x: randint(1, 4) for x in sample(‘abfcdrg’, randint(1,5))}
s2 = {x: randint(1, 4) for x in sample(‘abfcdrg’, randint(1,5))}
s3 = {x: randint(1, 4) for x in sample(‘abfcdrg’, randint(1,5))}

首先获取字典的keys,然后取每轮比赛key的交集。由于比赛轮次数是不定的,所以使用map来批量处理

map(dict.keys,[s1,s2,s3])

然后一直累积取其交集,使用reduce函数
reduce(lambda x,y:x&t, map(dict.keys [s1,s2,s3]))

map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
语法
map() 函数语法:
map(function, iterable, …)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值