对列表进行排序不会产生正确的结果

2024-09-29 09:37:17 发布

您现在位置:Python中文网/ 问答频道 /正文

python问题:

我正在运行一个sort函数来按日期对一些数据进行排序,但得到的输出不正确。我用一些示例数据准备了一个简短的代码版本来显示错误(完整的代码是无趣的,完整的真实数据是专有的)。在

代码如下:

import operator

mylist = [['CustomerID_12345', 'TransactionID_1001', '12/31/2012'],
['CustomerID_12345', 'TransactionID_1002', '3/12/2013'],
['CustomerID_12345', 'TransactionID_1003', '1/7/2013'],
['CustomerID_12345', 'TransactionID_1004', '12/31/2012']]


sorted_list = sorted(mylist, key=operator.itemgetter(2))


print type(mylist)
print len(mylist)

for i in mylist:
    print i

print ""        # just for a line break for convenience

for i in sorted_list:
    print i

输出是:

^{pr2}$

第一块是原始数据,第二块是输出。因为我试着按日期排序,很容易看出排序没有正常工作。在

有人能帮我解释一下错误并建议如何改正吗? 提前感谢:)


Tags: 数据函数代码infor排序错误sort
3条回答

按日期排序:

from datetime import datetime

mylist = [['CustomerID_12345', 'TransactionID_1001', '12/31/2012'],
        ['CustomerID_12345', 'TransactionID_1002', '3/12/2013'],
        ['CustomerID_12345', 'TransactionID_1003', '1/7/2013'],
        ['CustomerID_12345', 'TransactionID_1004', '12/31/2012']]


sorted_list = sorted(mylist, key=lambda x: datetime.strptime(x[2],'%m/%d/%Y'))
for item in sorted_list:
    print item

或者您可以首先将日期存储为datetime。如果它们是字符串,那么您可以首先添加一个datetime列:

^{pr2}$

这是因为python将它们视为字符串而不是日期。在

这是因为“1”小于“2”,而“2”小于“3” 而且“/”小于数字,因此存在问题。在

相反,请使用datetime模块将它们作为日期进行比较。在

下面是一个示例:

from datetime import datetime
your_date = datetime.strptime('1/1/2013', "%m/%d/%Y")
my_date = datetime.strptime('12/3/2011', "%m/%d/%Y")

print your_date > my_date
[Out]: True

分类正确。你用一种愚蠢的格式按日期字段排序,而不是按照实际日期排序。如果使用标准ISO格式(YYYY-MM-DD),它将按预期排序。另外,如果您使用用于日期的python数据结构,例如来自datetime模块的数据结构,它将按照您的期望进行排序。在

import datetime

mylist = [
    ['CustomerID_12345', 'TransactionID_1001', datetime.date(2012, 12, 13)],
    ['CustomerID_12345', 'TransactionID_1002', datetime.date(2013, 3, 12)],
    ...
]

或者,借用其他答案。如果您正在某处读取数据并希望将其从原始字符串格式转换为内部表示形式,这可能会对您有所帮助。在

^{pr2}$

或者,只使用字符串。。。在

mylist = [
    ['CustomerID_12345', 'TransactionID_1001', '2012-31-12'],
    ['CustomerID_12345', 'TransactionID_1002', '2013-03-12'],
    ...
]

如果您已经有一个与问题中的数组类似的数组,则可以轻松地进行转换:

new_list = [f1, f2, datetime.datetime.strptime(f3, '%m/%d/%Y').date()
    for f1, f2, f3 in old_list]

顺便说一下,M/D/YYYY(4/2/2014)格式是有史以来最愚蠢的日期格式之一,只有M/D/yyy(4/2/14)比这更糟糕。在

最好的格式是按大小降序排列单位,因为这也是我们对数字使用的方向。当使用适当的零填充时,它们可以很容易地进行排序(2014-04-02),这就是它们在计算机中,尤其是文件名中找到位置的原因。不太好的格式按升序排列单位,不尊重我们写数字的方式,这个系统在我国使用(今天是2014年4月2日)。但是,不按大小按升序或降序对单位进行排序的mishmash格式是我们几个世纪前就应该消灭的东西。在

相关问题 更多 >