【Python实战09】使用python进行数据的排序

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

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‘]
>>> 
可以看到这个结果就是我们想要的。








【Python实战09】使用python进行数据的排序

上一篇:C++字符串逆排序


下一篇:c/c++操作访问数据,是堆中的数据快还是栈中的数据快