一、pthone 排序
1、[].sort 排序:
在Python里,可以使用`[].sort`实现默认的自然排序,其效率还不错。
2、自定义函数排序:
列表排序的顺序只是适用自然顺序,很多时候,你需要特定的顺序。比如需要排序的字段不是第一个字符,按照默认排序是毫无意义的。通过定义一个自定义函数返回-1则表示前者排在后者之前,返回0则表示二者顺序相同,返回1则表示后者排在前者之前,可以实现自己排序规则。 `cmp()`就是`[].sort()`的默认比较函数(在速度上'lst.sort()'远远超过'lst.sort(cmp)')。对于不太长的列表使用自定义比较函数可以快速的解决问题。
在很多情况下,甚至可以直接使用一个'lambda'表达式来完成任务。 说到速度,使用自定义比较函数效率会很低。部分原因是Python的函数调用开销,函数本身也会增加花费的时间。不过有一种技术“Schwartzian转换”可以加速这种自定义排序。
二、Schwartzian转换原理:
Schwartzian转换是兰德尔施瓦兹在Perl中最先开始使用的,但其中的技巧同样适用于Python。 使用Schwartzian转换主要包括三个步骤,(准确的来说这是Guttman-Rosler转换(GRT),同样基于Schwartzian转换)
- 将列表转换为可以用默认排序的列表。
- 使用`[].sort()`排序。
- 转回原先的格式。
核心是将需要排序的对象转为一个能进行自然排序的字符串,任务里排序时间是主要因素的话,使用这项技术将大大提高效率(唯一的限制就是转换花费的时间不会很多)
三、实例:
考虑一个真实的案例:
我们的网站每个关键页面的访问都会有Cookie Log进行记录,Cookie log记录了用户的真实IP,访问的URL,时间等用户访问信息,每个应用是通过vip技术负载均衡到后面的具体的应用里面,Cookie log是通过Apache的module进行记录,由于并发,日志写入是并不是有序的,我们现在需要安装访问时间排序,以方便分析日志。真实的一行记录如下:
46.72.70.123 - - - [12/Sep/2012:23:59:50 -0700] "GET /www.xxx.com tm?productId=593651545&rnd=134 5370HTTP/1.1" 200 2131 82269 "http://www.xxx.com/ite545.html" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1" - - "a=mt=1|ms=|mid=ru1012642554; b=W_signed=Y; c=-"–
为了简单我们只取出时间不分排序,假设文本文件如下格式:
12/Sep/2012:23:59:50 12/Sep/2012:23:59:50
考虑可以将12/Sep/2012:23:59:50 转换为 20120912235950 然后按照自然排序就好了。
代码如下:
import sys, string, time, datetime wrerr = sys.stderr.write def get_Time(str): print len(str) print str time = datetime.datetime.strptime(str,'%d/%b/%Y:%H:%M:%S') return time.strftime("%Y%m%d%H%M%S") lines = open(sys.argv[1]).readlines() start = time.time() for n in range(len(lines)): lst = string.split(lines[n]) lines[n] = (get_Time(lines[n][:20]), lines[n]) lines.sort() for n in range(len(lines)): lines[n] = lines[n][1] end = time.time() wrerr("Schwartzian transform sort in %3.2f secs\n" % (end-start)) open('time.schwartzian','w').writelines(lines)
核心在于get_Time函数,讲时间转换为可以自然排序的字符串。。
上面真实的场景无非是在该函数的前面先将时间字符串获取,这个想必不难吧。。
参考
http://perl.plover.com/TPC/1998/Hardware-notes.html#Schwartzian_Transform
http://docs.python.org/2/faq/programming.html#i-want-to-do-a-complicated-sort-can-you-do-a-schwartzian-transform-in-python
本站支持 pay for your wishes
相关推荐
本文实例为大家分享了python实现人民币大写转换的具体代码,供大家参考,具体内容如下 #!/usr/bin/python # -*- coding:utf-8 -*- # ********* 转换方法介绍 ********* # 将需要转换的数字从右向左,每4位分成一个...
该程序包含7大排序算法: # sort.bubbleSort() #冒泡排序 # sort.shellSort() #希尔排序 # sort.insertionSort() #插入排序 # sort.Selectionsort1() #选择排序 # sort.heapSort() #堆排序 # sort.countSort() ...
这个名为"python写的坐标转换程序"的项目专注于使用Python编程语言实现坐标转换功能,特别是针对北京54坐标系。北京54坐标系是中国国内广泛使用的大地坐标系统,而布尔莎模型(Bursa-Wolf Model)是一种常用于大地...
python坐标转换程序
Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成...
Python ico文件转换器是一个简单的工具,可以将图像文件转换为 .ico 格式,以便在 Windows 操作系统中使用。这个工具可以帮助你轻松地将常见的图像格式(如 .jpg、.png、.bmp 等)转换为图标文件,当打包程序需要...
Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 ...
青少年python学习
在本场景中,我们关注的是如何利用Python将KML(Keyhole Markup Language)文件转换为Excel文件。KML是一种用于存储地理标记和地理数据的XML格式,常用于Google Earth和Google Maps。而Excel则是进行数据分析和表格...
插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入...
利用python将txt文件转换为epub格式,只需要将代码根据你的txt内容进行部分修改,就能进行转换。
在Python编程环境中,声音识别并将其转换为文字是一项常见的任务,尤其在语音识别软件、智能助手和自动会议记录等场景中。本主题将深入探讨如何使用Python实现这一功能,主要涉及以下几个关键知识点: 1. **音频...
python冒泡排序,适合python初学者
0026. python 快速排序教程.md 0026. python 快速排序教程.md 0026. python 快速排序教程.md 0026. python 快速排序教程.md 0026. python 快速排序教程.md 0026. python 快速排序教程.md 0026. python 快速排序教程....
内容简介:使用python 将excel表格转换为图表,使用GUI界面进行操作,可转换成html网页文件,也可以在html页面保存表格为图片。 此代码文件内,包括了exe执行文件以及源码,可以在任何电脑上执行此exe文件,不需要...
由于Python函数调用的开销较大,如果排序速度是主要考虑的因素,可以使用“Schwartzian转换”技术来加速自定义排序。 Schwartzian转换包括三个主要步骤:首先将列表中的元素转换为可以用默认排序的格式,然后使用`...
Python作为一个功能强大的编程语言,结合相应的库,可以实现高效的视频格式转换。在这个案例中,我们关注的是使用Python将MP4视频格式转换为AVI视频格式。下面将详细讲解如何实现这一过程,并介绍涉及的关键知识点。...
python将pdf文件转换成图片,可设置图片的清晰度,可对源码进行修改实现pdf文件批量转换为图片。此源码是单个文件的装换,
Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成...
在Python编程中,有时我们需要处理时间相关的数据,例如将毫秒转换为更易读的时分秒格式。这个任务在处理服务器返回的数据时尤其常见,因为服务器可能以毫秒为单位提供时间戳。本篇文章将深入探讨如何实现这一转换,...