Python:按任意列对文件排序,其中列包含时间值

Python:按任意列对文件排序,其中列包含时间值,python,sorting,Python,Sorting,我有一个人的.txt文件,每个人旁边都有两次。这是.txt文件 Xantippe 09:00 11:00 Erica 10:00 12:06 Marcia 09:30 11:45 Elizabeth 10:15 12:10 Angela 11:30 13:45 Freda 12:00 14:20 Maria 12:30 14:10 我被要求读取文件,然后获取每一行,读取它,并在第二次对整个列表进行排序。请记住,文件中的数字是字符串对象。因此,基本上最早的时间,即11:00,应该与

我有一个人的.txt文件,每个人旁边都有两次。这是.txt文件

 Xantippe 09:00 11:00
 Erica 10:00 12:06
 Marcia 09:30 11:45
 Elizabeth 10:15 12:10
 Angela 11:30 13:45
 Freda 12:00 14:20
 Maria 12:30 14:10
我被要求读取文件,然后获取每一行,读取它,并在第二次对整个列表进行排序。请记住,文件中的数字是字符串对象。因此,基本上最早的时间,即11:00,应该与之前的时间和名称一起排在列表的顶部。例如,
Xantippe 09:00 11:00
然后在另一行上下一行等

到目前为止,我已经做了:

from Practise1 import timeCalc
with open('LadiesRace.txt', 'r') as f:
  readf = f.read();
  timeX = timeCalc()
  lis = readf.split('\n')
  with open('sortByFinishTime.txt','w') as w:
    def compare(x,y):
      if x[1] > y[1]:
        return 1
      if x[1] < y[1]:
        return -1
      return 0
    #lis.sort()
    for l in lis:
      #line = l.strip()
      slist = l.split(' ')
      print slist[2]
从练习1导入时间计算器
以open('LadiesRace.txt','r')作为f:
readf=f.read();
timeX=timeCalc()
lis=readf.split('\n')
将open('sortByFinishTime.txt','w')作为w:
def比较(x,y):
如果x[1]>y[1]:
返回1
如果x[1]

问题是我不能使用字典,只能使用列表。我已经按名称按升序对列表进行了排序,但如何与上次排序?

首先,您需要将数据转换为可用格式。。。因此,让我们将其加载到内存中的一个列表中-需要注意的是,
dict
s本身并没有顺序,因此我们希望使用一个列表

with open('myfile.txt') as fin:
    lines = [line.split() for line in fin]
这将删除任何尾随的换行符,并用空格字符将其拆分。。。因此,我们最终得出以下结论:

[['Xantippe', '09:00', '11:00'], ['Erica', '10:00', '12:06'], ['Marcia', '09:30', '11:45'], ['Elizabeth', '10:15', '12:10'], ['Angela', '11:30', '13:45'], ['Freda', '12:00', '14:20'], ['Maria', '12:30', '14:10']]
[['Xantippe', '09:00', '11:00'], ['Marcia', '09:30', '11:45'], ['Erica', '10:00', '12:06'], ['Elizabeth', '10:15', '12:10'], ['Angela', '11:30', '13:45'], ['Maria', '12:30', '14:10'], ['Freda', '12:00', '14:20']]
然后,我们可以使用
列表的
.sort
方法--
itemgetter
是获取序列第n个元素的简便方法,因此我们有name、start、end,其中end是第二个索引(基于零是第一个,这将是名称)

我们最终会:

[['Xantippe', '09:00', '11:00'], ['Erica', '10:00', '12:06'], ['Marcia', '09:30', '11:45'], ['Elizabeth', '10:15', '12:10'], ['Angela', '11:30', '13:45'], ['Freda', '12:00', '14:20'], ['Maria', '12:30', '14:10']]
[['Xantippe', '09:00', '11:00'], ['Marcia', '09:30', '11:45'], ['Erica', '10:00', '12:06'], ['Elizabeth', '10:15', '12:10'], ['Angela', '11:30', '13:45'], ['Maria', '12:30', '14:10'], ['Freda', '12:00', '14:20']]
然后写下来:

with open('output.txt', 'w') as fout:
    for el in lines:
        fout.write('{0}\n'.format(' '.join(el)))

这实际上是你的代码吗?如果你写了这篇文章,你肯定已经知道答案了。这实际上是我的代码。我以前使用字典,现在使用列表,但我发现很难得到这个解决方案您已经很好地为列索引1排序了-为什么不将其更改为2?还是我完全误解了这个问题?哈哈,我是一个23岁的男人,我对这一切都是陌生的。这就是我该如何在txt文件中写下这些行?@Alfe在我的Head@Alfe
print>>fout',.join(el)
会起作用,你的也会起作用,但在写入之前,不需要将整个输出文件预先构建为字符串it@MuhammedBhikha如果它已经在您的输入文件中,它将自动作为另一个元素出现在您的列表中-如果您想查看添加元素-然后查看
list.append
@alfe-yup,“函数”方式,假设
map
是惰性的(3.x)或者使用
imap
,是
fmt='{}\n'。格式;fout.writelines(映射(fmt,行))
或确保它跨版本
fout.writelines(fmt(行)用于行中行))