接着上篇的分享我们继续往下看
目录
1.命名切片
问题:假如你的程序已经出现一大堆已无法直视的硬编码切片下标,然后你想清理一下代码。
思路:假定你有一段代码要从一个记录字符串中几个固定位置提取出特定的数据字段(比如文件或类似格式),我们可以用slice命名切片去提升代码质量
代码实现:
data = '.......100....0.2....'
zhenshu = slice(7,10)
xiaoshu = slice(14,17)
result = int(data[zhenshu]) * float(data[xiaoshu])
print(result) # 20.0
2.序列中出现次数最多的元素
问题:怎么找出一个序列中出现次数最多的元素呢?
思路:collections.Counter类就是专门为这类问题而设计的,它甚至有一个有用的most_common方法直接给你答案。
代码如下:
words = [
'my','eyes','look','girls','in','home',
'my','eyes','in','home',
'my','eyes','look','home',
'info','look','in'
]
from collections import Counter
word = Counter(words)
# 统计出现频率最高的三个单词
top_three = word.most_common(3)
print(top_three) # [('my', 3), ('eyes', 3), ('look', 3)]
3.通过某个关键字排序一个字典列表
问题:你有一个字典列表,你想根据某个或某个字典字段来排序这个列表
思路:可以通过operator中的itemgetter函数解决
代码如下:
from operator import itemgetter
students = [
{'name': '小花', 'age': 19, 'score': 90},
{'name': '明明', 'age': 20, 'score': 40},
{'name': '华仔', 'age': 18, 'score': 80},
{'name': '静静', 'age': 16, 'score': 77},
{'name': 'Tom', 'age': 17, 'score': 59},
{'name': 'Bob', 'age': 18, 'score': 90}]
stu1 = sorted(students,key=itemgetter('score'),reverse=True)
print(stu1)
"""
[{'name': '小花', 'age': 19, 'score': 90},
{'name': 'Bob', 'age': 18, 'score': 90},
{'name': '华仔', 'age': 18, 'score': 80},
{'name': '静静', 'age': 16, 'score': 77},
{'name': 'Tom', 'age': 17, 'score': 59},
{'name': '明明', 'age': 20, 'score': 40}]
"""
延伸:也可以使用匿名函数lambda来解决
代码如下:
students = [
{'name': '小花', 'age': 19, 'score': 90},
{'name': '明明', 'age': 20, 'score': 40},
{'name': '华仔', 'age': 18, 'score': 80},
{'name': '静静', 'age': 16, 'score': 77},
{'name': 'Tom', 'age': 17, 'score': 59},
{'name': 'Bob', 'age': 18, 'score': 90}]
stu2 = sorted(students,key=lambda k:k['score'],reverse=True)
print(stu2)
4.排序不支持原生比较的对象
问题:排序类型相同的对象,但是他们不支持原生的比较操作
思路:内置的sorted()函数有一个关键字参数key,可以传入一个callable对象给它,这个callable对象对每个传入的对象返回一个值,这个值会被sorted用来排序这些对象。
代码实现:
class User:
def __init__(self,user_id):
self.user_id = user_id
def __repr__(self):
return f'User{self.user_id}'
def sort_notcampare():
user = [User(23),User(3),User(99)]
print(user)
print(sorted(user,key=lambda u:u.user_id,reverse=True))
sort_notcampare()
5.通过某个字段将记录分组
问题:有一个字典或者实例的序列,然后根据某个特定的字段比如data来分组迭代访问。
思路:itertools.groupby()函数解决这类问题就特别简单了
代码如下:
from operator import itemgetter
from itertools import groupby
info = [
{'name':'张三','data':'2022.03.31'},
{'name':'李四','data':'2022.03.30'},
{'name':'王五','data':'2022.03.29'},
{'name':'胡六','data':'2022.03.31'},
]
info.sort(key=itemgetter('data'))
for data,items in groupby(info,key=itemgetter('data')):
print('data:',data)
for i in items:
print('结果:',i)
"""
data: 2022.03.29
结果: {'name': '王五', 'data': '2022.03.29'}
data: 2022.03.30
结果: {'name': '李四', 'data': '2022.03.30'}
data: 2022.03.31
结果: {'name': '张三', 'data': '2022.03.31'}
结果: {'name': '胡六', 'data': '2022.03.31'}
"""
6.结束语
python有强大的内置库,深度解析这些内置库可有效提高代码质量。
关注我,持续跟新关于python更多用法和技巧。创作不易,多多支持哦。