现在我这里有四个文件,文件的内容分别如下:
james.txt
2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22julie.txt
2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21mikey.txt
2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38sarah.txt
2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55可以看到,这四个文件中都是一些时间数据,现在的要求是找出每个文件中的最小的三个数,这样的话,我们就需要对这个文件进行排序了,在排序之前我们首先编写一段代码,将这些数据读取到内存,代码如下:
with open(‘james.txt‘) as jaf: data=jaf.readline() james=data.strip().split(‘,‘) with open(‘julie.txt‘) as juf: data=juf.readline() julie=data.strip().split(‘,‘) with open(‘mikey.txt‘) as mif: data=mif.readline() mikey=data.strip().split(‘,‘) with open(‘sarah.txt‘) as saf: data=saf.readline() sarah=data.strip().split(‘,‘) """打印四个列表""" print(james) print(julie) print(mikey) print(sarah)这里使用的是之前我们用到的数据读取操作,最后使用split()函数按照逗号将数据进行了分隔,运行结果如下:
>>> ================================ RESTART ================================ >>> [‘2-34‘, ‘3:21‘, ‘2.34‘, ‘2.45‘, ‘3.01‘, ‘2:01‘, ‘2:01‘, ‘3:10‘, ‘2-22‘] [‘2.59‘, ‘2.11‘, ‘2:11‘, ‘2:23‘, ‘3-10‘, ‘2-23‘, ‘3:10‘, ‘3.21‘, ‘3-21‘] [‘2:22‘, ‘3.01‘, ‘3:01‘, ‘3.02‘, ‘3:02‘, ‘3.02‘, ‘3:22‘, ‘2.49‘, ‘2:38‘] [‘2:58‘, ‘2.58‘, ‘2:39‘, ‘2-25‘, ‘2-55‘, ‘2:54‘, ‘2.18‘, ‘2:55‘, ‘2:55‘] >>>可以看到我们已经将数据读取到内存了,那么下一步就是进行数据排序了,在python中给我们提供了两种数据排序的方法,下面让我们一起来看看。
排序的两种方式
第一种是原地排序,即排序后的数据会替换原来的数据,对于列表排序,可以使用sort方法进行排序。第二种是复制排序,即排序后的数据会存储到另一个地方,并不影响原先的数据,对于列表,我们可以使用sorted方法进行排序。
我们首先来看一个原地排序的例子:
>>> data=[6,3,1,2,4,5] >>> data [6, 3, 1, 2, 4, 5] >>> >>> data.sort() >>> data [1, 2, 3, 4, 5, 6] >>>可以看到,我们调用sort方法之后,data的内容变成了排序之后的数据,这种方式称为“原地排序”。
下面是一个复制排序的例子:
>>> data=[6,3,1,2,4,5] >>> data [6, 3, 1, 2, 4, 5] >>> >>> data2=sorted(data) >>> data [6, 3, 1, 2, 4, 5] >>> data2 [1, 2, 3, 4, 5, 6] >>>观察可以看到,通过sorted方法进行排序,会把排序的结果给一个新的列表,而原先的列表的内容并不改变,这种方式称为“复制排序”。当然,如果你想通过sorted实现原地排序的话,只需要把data2换成data即可,如下:
>>> data=[6,3,1,2,4,5] >>> data [6, 3, 1, 2, 4, 5] >>> data=sorted(data) >>> data [1, 2, 3, 4, 5, 6] >>>通过排序后的列表将之前的列表给覆盖了。
这里我们使用复制排序的方法进行以上的数据排序,现在修改之前的代码,实现数据的排序,然后进行输出,代码如下:
with open(‘james.txt‘) as jaf: data=jaf.readline() james=data.strip().split(‘,‘) with open(‘julie.txt‘) as juf: data=juf.readline() julie=data.strip().split(‘,‘) with open(‘mikey.txt‘) as mif: data=mif.readline() mikey=data.strip().split(‘,‘) with open(‘sarah.txt‘) as saf: data=saf.readline() sarah=data.strip().split(‘,‘) """打印四个列表""" print(sorted(james)) print(sorted(julie)) print(sorted(mikey)) print(sorted(sarah))这里我们在print函数进行打印之前,将数据进行了排序,运行结果如下:
>>> ================================ RESTART ================================ >>> [‘2-22‘, ‘2-34‘, ‘2.34‘, ‘2.45‘, ‘2:01‘, ‘2:01‘, ‘3.01‘, ‘3:10‘, ‘3:21‘] [‘2-23‘, ‘2.11‘, ‘2.59‘, ‘2:11‘, ‘2:23‘, ‘3-10‘, ‘3-21‘, ‘3.21‘, ‘3:10‘] [‘2.49‘, ‘2:22‘, ‘2:38‘, ‘3.01‘, ‘3.02‘, ‘3.02‘, ‘3:01‘, ‘3:02‘, ‘3:22‘] [‘2-25‘, ‘2-55‘, ‘2.18‘, ‘2.58‘, ‘2:39‘, ‘2:54‘, ‘2:55‘, ‘2:55‘, ‘2:58‘] >>>观察以上的数据,可以看到进行了一些简单的排序,但是以上数据的排序也有一些问题,比如:第一行中‘2-22‘, ‘2-34‘, ‘2.34‘, ‘2.45‘, ‘2:01‘,最后一个2:01明显是最小的,却放在了第五为,这是因为我们所有的数据的格式并不统一,导致排序结果并不是我们想要的,所以我们还要添加一步操作:对数据格式进行统一,这里我们全部统一为以点代表数据,如:2.01,代码如下:
def sanitize(time_string): if ‘-‘ in time_string: splitter=‘-‘ elif ‘:‘ in time_string: splitter=‘:‘ else: return(time_string) (mins,secs)=time_string.split(splitter) return(mins+‘.‘+secs) with open(‘james.txt‘) as jaf: data=jaf.readline() james=data.strip().split(‘,‘) with open(‘julie.txt‘) as juf: data=juf.readline() julie=data.strip().split(‘,‘) with open(‘mikey.txt‘) as mif: data=mif.readline() mikey=data.strip().split(‘,‘) with open(‘sarah.txt‘) as saf: data=saf.readline() sarah=data.strip().split(‘,‘) clean_james=[] clean_julie=[] clean_mikey=[] clean_sarah=[] for each in james: clean_james.append(sanitize(each)) for each in julie: clean_julie.append(sanitize(each)) for each in mikey: clean_mikey.append(sanitize(each)) for each in sarah: clean_sarah.append(sanitize(each)) """打印四个列表""" print(sorted(clean_james)) print(sorted(clean_julie)) print(sorted(clean_mikey)) print(sorted(clean_sarah))可以看到,我们首先定义了一个函数,这个函数的主要功能是将每个时间转换为我们想要的格式,然后我们通过四个for循环分别对每个列表中的数据进行处理,最后进行排序打印,结果如下:
>>> ================================ RESTART ================================ >>> [‘2.01‘, ‘2.01‘, ‘2.22‘, ‘2.34‘, ‘2.34‘, ‘2.45‘, ‘3.01‘, ‘3.10‘, ‘3.21‘] [‘2.11‘, ‘2.11‘, ‘2.23‘, ‘2.23‘, ‘2.59‘, ‘3.10‘, ‘3.10‘, ‘3.21‘, ‘3.21‘] [‘2.22‘, ‘2.38‘, ‘2.49‘, ‘3.01‘, ‘3.01‘, ‘3.02‘, ‘3.02‘, ‘3.02‘, ‘3.22‘] [‘2.18‘, ‘2.25‘, ‘2.39‘, ‘2.54‘, ‘2.55‘, ‘2.55‘, ‘2.55‘, ‘2.58‘, ‘2.58‘] >>>可以看到这个结果就是我们想要的。