一、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排序算法——冒泡排序 Python排序算法——插入排序 Python排序算法——选择排序 Python排序算法——快速排序 Python排序算法——归并排序
python冒泡排序优化后的python冒泡排序优化后的python冒泡排序优化后的...排序python冒泡排序优化后的python冒泡排序优化后的python冒泡排序优化后的python冒泡排序优化后的python冒泡排序优化后的python冒泡排序优化...
python坐标转换程序
利用python将txt文件转换为epub格式,只需要将代码根据你的txt内容进行部分修改,就能进行转换。
Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成元组 Python源码Python 将DataFrame数据转换成...
基于布尔莎模型写的坐标转换程序,可以用于北京54坐标系等坐标转换之用,python代码,注释详细。
插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入排序.py python实现的排序插入...
python冒泡排序,适合python初学者
内容简介:使用python 将excel表格转换为图表,使用GUI界面进行操作,可转换成html网页文件,也可以在html页面保存表格为图片。 此代码文件内,包括了exe执行文件以及源码,可以在任何电脑上执行此exe文件,不需要...
python冒泡排序 Python排序算法:堆排序、归并排序、简单选择排序、冒泡排序、希尔排序、直接插入排序
基于python脚本ocv图片转换,dlib库定位五官位置基于python脚本ocv图片转换,dlib库定位五官位置基于python脚本ocv图片转换,dlib库定位五官位置基于python脚本ocv图片转换,dlib库定位五官位置基于python脚本ocv...
Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 Python源码Python RGB模式颜色转换器 ...
python将pdf文件转换成图片,可设置图片的清晰度,可对源码进行修改实现pdf文件批量转换为图片。此源码是单个文件的装换,
Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成列表 Python源码Python 将DataFrame数据转换成...
python的强制类型转换规则 Python的强制类型转换规则 Python是一种动态类型语言,这意味着变量的类型是在运行时确定的。在Python中,变量可以随时被赋予不同类型的值,这使得Python非常灵活和易于使用。但是,有时候...
Python实现的进制转换器#1、十六进制以内实数任意进制对任意进制的转换 #2、小数位数超过十位保留十位小数 #3、包含负数的转换(是数值的转换而不是补码) #4、能够实现更高进制的转换:直接增加waitNumber中的字母...
整合爬取到的ts文件自动排序合成MP4视频
本文实例讲述了python转换字符串为摩尔斯电码的方法。分享给大家供大家参考。具体实现方法如下: chars = ",.0123456789?abcdefghijklmnopqrstuvwxyz" codes = """--..-- .-.-.- ----- .---- ..--- ...-- ....- ......