深度解析python中的数据结构和算法(三)

接着上篇的分享我们继续往下看

目录

1.命名切片

2.序列中出现次数最多的元素

3.通过某个关键字排序一个字典列表

4.排序不支持原生比较的对象

5.通过某个字段将记录分组

6.结束语

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更多用法和技巧。创作不易,多多支持哦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戒酒的李白-Lisage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值