根据包含列表对列表进行排序

时间:2019-01-27 13:24:40

标签: python

我必须基于索引0的值对包含其他列表的列表进行排序。从下面的示例可以很明显地看出,我必须基于每个嵌套列表的年限对'tempdb'进行排序,但是我没有线索。我不允许导入像NumPy这样的库,所以只能“裸” Python代码。

列表示例:

tempdb = [
['8-8-2007', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2007'],
['8-8-2015', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2015'],
['30-11-2005', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'nov', '2005'],
['8-8-2006', '268', 'Anonymized', 'ordertarief', 'aug', '2006'],
['30-11-2006', '268', 'Anonymized', 'ordertarief', 'nov', '2006'],
['30-11-2003', '268', 'Anonymized', 'gammaglutamyltranspeptidase', 'nov', '2003'],
['30-11-2006', '268', 'Anonymized', 'melkzuurdehydrogenase -ldh- kinetisch', 'nov', '2006'],
['30-11-2006', '268', 'Anonymized', 'alkalische fosfatase -kinetisch-', 'nov', '2006'],
['30-11-2002', '268', 'Anonymized', 'natrium vlamfotometrisch', 'nov', '2002'],
]

这是我发现并已经尝试过的方法,但是对我来说不起作用。

sort_on   = lambda pos:     lambda x: x[pos]
tempdb = sorted(tempdb,key=sort_on(1)) 

我的目标是从最早的年份(例如2002年)开始,到最新的年份(例如2015年)结束

3 个答案:

答案 0 :(得分:2)

您可以使用datetime模块比较日期:

from datetime import datetime

tempdb = [
['8-8-2007', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2007'],
['8-8-2015', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2015'],
['30-11-2005', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'nov', '2005'],
['8-8-2006', '268', 'Anonymized', 'ordertarief', 'aug', '2006'],
['30-11-2006', '268', 'Anonymized', 'ordertarief', 'nov', '2006'],
['30-11-2003', '268', 'Anonymized', 'gammaglutamyltranspeptidase', 'nov', '2003'],
['30-11-2006', '268', 'Anonymized', 'melkzuurdehydrogenase -ldh- kinetisch', 'nov', '2006'],
['30-11-2006', '268', 'Anonymized', 'alkalische fosfatase -kinetisch-', 'nov', '2006'],
['30-11-2002', '268', 'Anonymized', 'natrium vlamfotometrisch', 'nov', '2002'],
]

tempdb = sorted(tempdb, key=lambda x: datetime.strptime(x[0], '%d-%m-%Y'))

for i in tempdb: print(i)

输出:

['30-11-2002', '268', 'Anonymized', 'natrium vlamfotometrisch', 'nov', '2002']
['30-11-2003', '268', 'Anonymized', 'gammaglutamyltranspeptidase', 'nov', '2003']
['30-11-2005', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'nov', '2005']
['8-8-2006', '268', 'Anonymized', 'ordertarief', 'aug', '2006']
['30-11-2006', '268', 'Anonymized', 'ordertarief', 'nov', '2006']
['30-11-2006', '268', 'Anonymized', 'melkzuurdehydrogenase -ldh- kinetisch', 'nov', '2006']
['30-11-2006', '268', 'Anonymized', 'alkalische fosfatase -kinetisch-', 'nov', '2006']
['8-8-2007', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2007']
['8-8-2015', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2015']

如果要沿相反的方向排序,请将reverse=True添加到sorted()函数中。

答案 1 :(得分:1)

最简单的解决方案是按每个内部列表的最后一个字符串排序..但是,如果年份相同,则无法正确排序monts / days。

如果您在'-'处将其拆分,则可以使用第一个元素,将每个数字转换为整数,然后将结果取反,然后使用该元素进行排序:

'8-8-2015' --> [2015,8,8] 

代码:

tempdb = [
['8-8-2007', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2007'],
['8-8-20015', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2015'],
['30-11-2005', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'nov', '2005'],
['8-8-2006', '268', 'Anonymized', 'ordertarief', 'aug', '2006'],
['30-11-2006', '268', 'Anonymized', 'ordertarief', 'nov', '2006'],
['30-11-2003', '268', 'Anonymized', 'gammaglutamyltranspeptidase', 'nov', '2003'],
['30-11-2006', '268', 'Anonymized', 'melkzuurdehydrogenase -ldh- kinetisch', 'nov', '2006'],
['30-11-2006', '268', 'Anonymized', 'alkalische fosfatase -kinetisch-', 'nov', '2006'],
['30-11-2002', '268', 'Anonymized', 'natrium vlamfotometrisch', 'nov', '2002'],
]

s = sorted(tempdb, key = lambda x: list(map(int,reversed(x[0].split('-')))))
print(s)

输出:

[['30-11-2002', '268', 'Anonymized', 'natrium vlamfotometrisch', 'nov', '2002'], 
 ['30-11-2003', '268', 'Anonymized', 'gammaglutamyltranspeptidase', 'nov', '2003'], 
 ['30-11-2005', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'nov', '2005'], 
 ['8-8-2006', '268', 'Anonymized', 'ordertarief', 'aug', '2006'], 
 ['30-11-2006', '268', 'Anonymized', 'ordertarief', 'nov', '2006'], 
 ['30-11-2006', '268', 'Anonymized', 'melkzuurdehydrogenase -ldh- kinetisch', 'nov','2006'],
 ['30-11-2006', '268', 'Anonymized', 'alkalische fosfatase -kinetisch-', 'nov', '2006'],
 ['8-8-2007', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2007'], 
 ['8-8-20015', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2015']]

您仍然提供了“无效”数据-f.e. '8-8-20015'-就是您。

答案 2 :(得分:0)

假设您要按年份排序,然后按中间的数字排序,然后按日期的第一个数字排序:

sorted(tempdb, key=lambda x: tuple(map(int, x[0].split('-')[::-1])))