背景介绍

排行榜业务使用的频率实在太高了,各种活动都会使用排行榜。经过多次开发后我觉得实现一个简单的排行榜库,它能够完成当前我遇到的所有业务逻辑问题,也希望能够帮助到想要快速开发排行榜业务的同行。

我设计了landport游戏框架,但是目前该框架只是提供websocket的连接管理提供有些房间之间的通信等。还未投入生产而组件类的开发业余时间进行。例如接下来介绍的排行榜就可以投入使用了,期待更您的参与。github

安装

pip install landport

分析需要

产品说暑假就要到了,准备对我们的游戏做活动。那么如果玩家在这段时间内得分靠前就可以获得礼品,礼品是按照不同的排名分不同的等级。

我们需要解决的第一问题是怎么排序,然后是怎么匹配奖品。假设我们的数据格式如下:

data = [

{

"uid" : 10011,

"score": 120,

},

{

"uid": 10022,

"score":230

},

{

"uid": 10033,

"score":222

},

{

"uid": 10044,

"score":30

}

]

这是我们的初始化数据,一般这些数据是通过数据库获取到的。下面声明一个排行榜实例,排行榜有一个需求是显示用户的榜单是上升还是下降,这个需要数据库缓存上一次的结果,目前使用的缓存是redis数据库实现。所以这里需要大家安装并且启动你的redis数据库。

import redis

from landport.core.rank import RanklistBase as Ranklist

r = redis.Redis("127.0.0.1", 6379, 0)

rk = Ranklist('my_redis_cache', r)

下面是把我们的数据一个个push_in到我们的排行榜中,这里我们使用一个循环去加载数据。

for item in data:

rk.push_in(item)

我们的排行榜有了数据后就可以进行相应的操作了,首先是排序。

rk.sort_by("score")

我们排序完成后可以通过下面的方式得到排序后的排行榜。

new_data = rk.top(10)

下面查看当前的全部代码如下:

import redis

from landport.core.rank import RanklistBase as Ranklist

r = redis.Redis("127.0.0.1", 6379, 0)

data = [

{

"uid" : 10011,

"score": 120,

},

{

"uid": 10022,

"score":230

},

{

"uid": 10033,

"score":222

},

{

"uid": 10044,

"score":30

}

]

if __name__ == '__main__':

print(data)

rk = Ranklist('my_redis_cache', r)

for item in data:

rk.push_in(item)

rk.sort_by("score")

new_data = rk.top(10)

print(new_data)

目前我们只是得到了一个按照给定的项逆序排好了,我们并没有给出这是第几名。当然我们知道下标是0的是第一名,客户端的人就不一定这样认为了。我们可以继续改进如下:

rk.sort_by("score").add_rank(care='score')

这时候看起来工作才不多收尾了,让产品过来看看。

产品说他们想给用户更加强烈的竞争感,所以希望排行榜有上升的箭头或者落后的箭头。

我当时思考了半天,现在你不需要思考了。直接使用下面的方式即可。

rk.sort_by("score").add_rank(care='score').add_trend()

下面给出两次调用的运行截图。

我想解释一下trend项,我设计的时候定义了如下规则

-1 ---> 名次下降

0 ---> 名次不变

1 ---> 名次上升

当要与客户端联调的时候发现,自己忘记加奖品了。不过使用landport你可以调用add_gift实现奖品的添加,只需要配置好奖品的映射就可以了。下面咱们先设计好奖品的配置。

gift_config = {

"1":{

"name":"iPhone 7 plus",

"something":"something"

},

"2~3":{

"name":"Nokia ...",

"something":"gift img url"

},

"4":{

"name":"flower",

"something":"desc ."

}

}

然后继续链式调用我们的add_gift方法。

rk.sort_by("score").add_rank(care='score').add_trend().add_gift(gift_config)

总结

目前为止我们实现了一个简单的排行榜示例,还有很多功能我没有演示。例如:同名的情况证明出来,查看我自己的排名怎么处理。等等有些功能库已经实现,有些则我会慢慢增加库的开发,也期待你的参与。最后给出所有代码

import redis

from landport.core.rank import RanklistBase as Ranklist

r = redis.Redis("127.0.0.1", 6379, 0)

data = [

{

"uid" : 10011,

"score": 120,

},

{

"uid": 10022,

"score":230

},

{

"uid": 10033,

"score":222

},

{

"uid": 10044,

"score":30

}

]

gift_config = {

"1":{

"name":"iPhone 7 plus",

"something":"something"

},

"2~3":{

"name":"Nokia ...",

"something":"gift img url"

},

"4":{

"name":"flower",

"something":"desc ."

}

}

if __name__ == '__main__':

print(data)

rk = Ranklist('my_redis_cache', r)

for item in data:

rk.push_in(item)

rk.sort_by("score").add_rank(care='score').add_trend().add_gift(gift_config)

new_data = rk.top(10)

print(new_data)

python库排行榜_使用python landport库快速实现排行榜相关推荐

  1. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  2. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  3. python选择题题目_《Python程序设计》题库 - 选择题

    一.基础知识 1 . Python 语言属于( ) . C A . 机器语言 B . 汇编语言 C .高级语言 D .科学计算语言 2 .下列选项中,不属于 Python 特点的是( ) . B A ...

  4. python requests 重定向_认识Python最最最常用语重要的库Requests

    Requests库是Python爬虫中最最最最最最重要与常见的库,一定要熟练掌握它.下面我们来认识这个库 Requests requests是Python最为常用的http请求库,也是极其简单的.使用 ...

  5. python社区版可以用库么_应用Python,你不但能够得到出色的小区适用和普遍的库集...

    哪样计算机语言最好是?这个问题很有可能始终不容易找答案.萝卜青菜,各有所好,AI技术工程师和生物学家能够依据新项目必须,从诸多计算机语言中挑选最合适自身的. 选Python還是选Java?2020年, ...

  6. python编辑程序模型_用Python的SimPy库简化复杂的编程模型的介绍

    在我遇到 SimPy 包的其中一位创始人 Klaus Miller 时,从他那里知道了这个包.Miller 博士阅读过几篇提出使用 Python 2.2+ 生成器实现半协同例程和"轻便&qu ...

  7. python 标准库 书籍_《Python标准库》Python语言的权威之作

    <Python标准库>由资深python专家亲自执笔,python语言的核心开发人员作序推荐,是Python的权威之作,书中对一百多个模块进行了生动的讲解.<Python标准库> ...

  8. python库名_在python存储库名称和包名称中使用连字符/破折号 - python

    我试图使我的git仓库pip可安装.为此,我正在重组仓库以遵循正确的约定.通过查看其他存储库,我的理解是,我应该将所有源代码放在与存储库名称相同的软件包中.例如.如果我的存储库称为myrepo,则源代 ...

  9. visual studio code Python终端运行_微软常用运行库合集32/64位只需一键全部安装

    微软常用运行库合集32/64位这些运行库都是采用Microsoft Visual Studio 20XX编写的软件必须使用的公用DLL运行库,相当于程序的字典文件:只需要一键全部安装,堪称装机必备神器 ...

最新文章

  1. SpringBoot使用JSP作为模板
  2. 重启centOS丢失nginx.pid导致无法启动nginx的解决方法
  3. Silverlight 5 RC新特性探索系列:13.Silverlight 5 RC 新增对并行任务库(TPL)的支持
  4. 【PP生产订单】入门介绍(十一)
  5. 2021-10-20 Speaking Class
  6. Genymotion模拟器拖入文件报An error occured while deploying the file的错误
  7. python 系统学习实例1.1 - 华氏度与摄氏度的转换
  8. readdir函数_PHP readdir()函数与示例
  9. js进阶 14-8 表单序列化函数serializeArray()和serialize()的区别是什么
  10. Emlog文章海报插件
  11. pytorch中查看可训练参数
  12. oraclek导出表_oracle如何导出和导入数据库/表
  13. 基于java技术的幼儿园管理系统答辩PPT模板
  14. 单片机快速开根号函数
  15. 局域网使用NAT进行测试第三方接口
  16. WebGL编程指南三:varying变量的使用和理解光栅化过程。
  17. 5月17号软件资讯更新合集....
  18. 程序员通常都有哪些业余爱好
  19. 基于python3.7 numpy scipy matplotlib sklearn的机器学习笔记5—监督学习之KNN、DT、NB算法简析
  20. 我与《JavaScript高级程序设计》的相爱相杀----JavaScript摘记

热门文章

  1. 微信小程序内嵌webview实现微信登录
  2. Edge插件默认位置
  3. [Python] OpenCV 摄像头黑边问题
  4. 十七.SpringCloud+Security+Oauth2实现微服务授权 -非对称加密生成JWT令牌
  5. python b站 排行_Python 爬取B站 视频热度排行数据
  6. HTML5期末大作业:旅游景点网站设计——北京故宫(9页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码
  7. tomcat安装运行和idea项目部署----详解
  8. php有strock吗,stroke方法怎么使用
  9. 金属膜电阻的型号问题
  10. H2数据库报错代码汇总