2010-08-07 45 views
0

我开始了与日期字符串:数据排序对象

from operator import itemgetter 
import datetime as DT 

# unsorted dates 
raw = (map(int, "2010-08-01".split("-")), 
     map(int, "2010-03-25".split("-")), 
     map(int, "2010-07-01".split("-"))) 

transactions = [] 
for year, month, day in raw: 
    new = (DT.date(year, month, day), "Some data here") 
    transactions.append(new) 
# transactions is now a list with tuples nested inside, for example 
# [(date, "Some data here"), (date, "Some data here")] 

sorted(transactions, key=itemgetter(0)) 

for info in transactions: 
    print info 

我得到了以下内容,它按日期没有排序:

(datetime.date(2010, 8, 1), 'Some data here') 
(datetime.date(2010, 3, 25), 'Some data here') 
(datetime.date(2010, 7, 1), 'Some data here') 

这些按日期我怎么排序?

回答

3

sorted返回一个排序列表,但输入本身保持不变。尝试

transactions.sort(key=itemgetter(0)) 

改为。 (默认元组按字典顺序进行比较,所以你不需要key)。

2

如果要修改原始数据,应该使用排序方法,通常最好保留原始数据并按排序()排序并将值分配给新变量。

transactions.sort() 

关键itemgetter是不必要的,因为你想要正常排序。

我对你的整个代码版本:

import datetime as DT 

# unsorted dates 
raw = ("2010-08-01","2010-03-25","2010-07-01") 

datetuples = [tuple(int(numstr) for numstr in dt.split('-')) 
       for dt in raw] ## numbers from strings 

transactions = [(DT.date(* dateint), 
       "Some data here") for dateint in datetuples] 

transactions.sort() 

for info in transactions: 
    print info 
4

嗯,这是没有排序的原因是,你有没有重新分配排序列表回transactions;你想:

transactions = sorted(transactions, key=itemgetter(0)) 

我要指出的是datetimestrptime功能,做你手动做什么:

transactions = [ (DT.datetime.strptime(datestring, "%Y-%m-%d").date(), "Some data here") for datestring in datestrings ] 

您也可能更喜欢collections.OrderedDict,虽然也许不是...

alt_transactions = collections.OrderedDict(sorted(transactions.items())) 
+0

它真的那么复杂吗?看看KennyTM的答案。 – simplyharsh 2010-08-07 10:07:21

+2

你甚至读过*答案吗?第一行解决OP的问题,其余的是对其他代码的帮助。下次尝试关注。 – katrielalex 2010-08-07 10:10:38

+0

+1为重新分配提醒。我只想使用'date',因为我只需要日期信息。但是,它没有'strptime()' – Kit 2010-08-07 10:13:41