欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[Python实战09]使用python进行数据的排序

程序员文章站 2022-05-07 19:35:58
现在我这里有四个文件,文件的内容分别如下: james.txt   2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22...

现在我这里有四个文件,文件的内容分别如下:

james.txt

 

2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22
julie.txt

 

 

2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21
mikey.txt

 

 

2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38
sarah.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']
>>> 
可以看到这个结果就是我们想要的。