Skip to main content
 首页 » 编程设计

Python 根据第一个属性在内部按日期排序

2025年05月04日7davidwang456

我有一个数据集,有8个属性(按第一个属性排序),格式如下(仅举个例子,是制表符分隔的)

AX  0123  December 20, 2010  1  2  8.0  hello this 
AX  2313  April 19, 2009  2  3  4.0  hi there 
AX  4532  December 19, 2010  6  2  8.0  nice tie 
AX  1244  January 10, 2011  3  4  8.0  king tale 
BX  0214  September 10, 2009  2  3  9.0 this king 
BX  0114  February 9, 2003  4  9  4.0  his brought 
BX  3214  September 1, 2006  1  3  3.0 is great 
MG  980   April 20, 2007  2  4  7.1  not available 
MG  246   May 8, 2005  5  1  2.1  make goat   

现在,文件已根据第一个属性排序,现在我需要根据第一个属性在内部根据日期排序,输出应该是这样的(我不想使用数据库,这是一个巨大的文件(2 GB) 所以我认为可能需要一个特殊的 python 代码(不确定是否可以用一个简单的代码来做到这一点)

AX  2313  April 19, 2009  2  3  4.0  hi there 
AX  4532  December 19, 2010  6  2  8.0  nice tie 
AX  0123  December 20, 2010  1  2  8.0  hello this 
AX  1244  January 10, 2011  3  4  8.0  king tale 
BX  0114  February 9, 2003  4  9  4.0  his brought 
BX  3214  September 1, 2006  1  3  3.0 is great 
BX  0214  September 10, 2009  2  3  9.0 this king 
MG  246   May 8, 2005  5  1  2.1  make goat 
MG  980   April 20, 2007  2  4  7.1  not available 

非常感谢任何回复。如果您有任何其他问题,请告诉我。

请您参考如下方法:

好的,又快又脏。你可以改进它:

from datetime import datetime as dt 
from collections import defaultdict 
 
dd = defaultdict(list) 
 
with open('test.txt') as f: 
    for line in f: 
        lines = line.split('\t') 
        dd[lines[0]].append(lines) 
 
def mydate(line): 
    return dt.strptime(line[2], "%B %d, %Y") 
 
keys = sorted(dd.keys()) 
 
my_list = [] 
for key in keys: 
    dd[key].sort(key=mydate) 
    my_list.extend(dd[key]) 
 
for item in my_list: 
    print item 

这会产生:

['AX', '2313', 'April 19, 2009', '2', '3', '4.0', 'hi there\n'] 
['AX', '4532', 'December 19, 2010', '6', '2', '8.0', 'nice tie\n'] 
['AX', '0123', 'December 20, 2010', '1', '2', '8.0', 'hello this\n'] 
['AX', '1244', 'January 10, 2011', '3', '4', '8.0', 'king tale\n'] 
['BX', '0114', 'February 9, 2003', '4', '9', '4.0', 'his brought\n'] 
['BX', '3214', 'September 1, 2006', '1', '3', '3.0 is great\n'] 
['BX', '0214', 'September 10, 2009', '2', '3', '9.0 this king\n'] 
['MG', '246', 'May 8, 2005', '5', '1', '2.1', 'make goat'] 
['MG', '980', 'April 20, 2007', '2', '4', '7.1', 'not available\n'] 

那么你只需要string.join()所有的列表

text_lines = [] 
for item in my_list: 
    text_lines.append('\t'.join(item)) 
 
full_text = ''.join(text_lines)