Python按时间字符串对二维列表进行排序

标签 python string sorting numpy

如何根据时间字符串对这样的多维列表进行排序?子列表可以有不同的大小(即此处的 4 和 5)

我想通过比较每个子列表中的第一个时间字符串(sublist[-4])来排序

x =  
(['1513', '08:19PM', '10:21PM', 1, 4],
['1290', '09:45PM', '11:43PM', 1, 4],
['0690', '07:25AM', '09:19AM', 1, 4],
['0201', '08:50AM', '10:50AM', 1, 4],
['1166', '04:35PM', '06:36PM', 1, 4],
['0845', '05:40PM', '07:44PM', 1, 4],
['1267', '07:05PM', '09:07PM', 1, 4],
['1513', '08:19PM', '10:21PM', 1, 4],
['1290', '09:45PM', '11:43PM', 1, 4],
['8772', '0159', '12:33PM', '02:43PM', 1, 5],
['0888', '0570', '09:42PM', '12:20AM', 1, 5],
['2086', '2231', '04:10PM', '06:20PM', 1, 5])

排序结果为

sortedX = 
    (['0690', '07:25AM', '09:19AM', 1, 4],
    ['0201', '08:50AM', '10:50AM', 1, 4],
    ['1166', '04:35PM', '06:36PM', 1, 4],
    ['0845', '05:40PM', '07:44PM', 1, 4],
    ['1267', '07:05PM', '09:07PM', 1, 4],
    ['1513', '08:19PM', '10:21PM', 1, 4],
    ['1513', '08:19PM', '10:21PM', 1, 4],
    ['1290', '09:45PM', '11:43PM', 1, 4],
    ['1290', '09:45PM', '11:43PM', 1, 4],
    ['8772', '0159', '12:33PM', '02:43PM', 1, 5], 
    ['2086', '2231', '04:10PM', '06:20PM', 1, 5],
    ['0888', '0570', '09:42PM', '12:20AM', 1, 5])

我尝试了以下方法:

sortedX = sorted(x, key=lambda k : k[-4])   #k[-4] is the first time string

它可以工作,但它不尊重子列表大小排序

最佳答案

通过字符串比较时间可能会有错误,因为字符串是按字典顺序比较的:

>>> '02:00PM' > '12:00PM'
False
>>> '2' > '100'
True

因此,首先使用 time.strptime 将这些时间字符串转换为时间对象。

>>> import time
>>> import pprint
def func(x):
    return (len(x), time.strptime(x[-4], '%I:%M%p'))
... 
>>> pprint.pprint(sorted(x, key=func))
[['0690', '07:25AM', '09:19AM', 1, 4],
 ['0201', '08:50AM', '10:50AM', 1, 4],
 ['1166', '04:35PM', '06:36PM', 1, 4],
 ['0845', '05:40PM', '07:44PM', 1, 4],
 ['1267', '07:05PM', '09:07PM', 1, 4],
 ['1513', '08:19PM', '10:21PM', 1, 4],
 ['1513', '08:19PM', '10:21PM', 1, 4],
 ['1290', '09:45PM', '11:43PM', 1, 4],
 ['1290', '09:45PM', '11:43PM', 1, 4],
 ['8772', '0159', '12:33PM', '02:43PM', 1, 5],
 ['2086', '2231', '04:10PM', '06:20PM', 1, 5],
 ['0888', '0570', '09:42PM', '12:20AM', 1, 5]]

要按多个值排序,请使用元组,在您的情况下,第一项是长度和时间对象,第二项是长度和时间对象。

关于Python按时间字符串对二维列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19869065/

相关文章:

javascript - 如何在具有文件 jquery.dataTables.js 的 jquery 插件中对同一列中的日期和字符串进行排序?

python - 通过 Sphinx 从脚本中获取文档字符串

Python:检查 globals() 中变量是否存在使其在本地上下文中不可见

java - 如何在 kotlin 中将字符串中的运算符号设置为 int

perl - 在 Perl 中检查字符串是否为空的正确方法是什么?

c++ - 我怎样才能对C++中的最大值进行排序?

python - PyThreadState_GET() 从 PyImport_GetModuleDict() 中返回 NULL

python - 无法嵌入 python 以使用压缩库

c++ - 从字符串中删除 BBcode

python - 内置函数 "sorted"在 Python 中如何工作?