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, …)