首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于包含列表对列表进行排序

基于包含列表对列表进行排序
EN

Stack Overflow用户
提问于 2019-01-27 21:24:40
回答 3查看 57关注 0票数 1

我必须根据索引0的值对包含其他列表的列表进行排序。从下面的例子可以清楚地看出,我必须根据每个嵌套列表的年份对“tempdb”进行排序,但我没有任何线索。我不允许导入像NumPy这样的库,所以只能‘裸’Python代码。

列表示例:

代码语言:javascript
复制
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'],
]

这是我发现并已经尝试过的东西,但它对我不起作用。

代码语言:javascript
复制
sort_on   = lambda pos:     lambda x: x[pos]
tempdb = sorted(tempdb,key=sort_on(1)) 

我的目标是从最老的年份开始(例如:2002),并以最新年份结束(例如2015年)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-27 21:54:52

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

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
['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']

如果您希望以相反的方向进行排序,请在sorted()函数中添加reverse=True

票数 2
EN

Stack Overflow用户

发布于 2019-01-27 21:43:53

最简单的解决方案是按每个内部列表的最后一个字符串排序。但是如果年份相同,这将不会正确地对月/日进行排序。

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

代码语言:javascript
复制
'8-8-2015' --> [2015,8,8] 

代码:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
[['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' -那是你的错。

票数 1
EN

Stack Overflow用户

发布于 2019-01-27 21:37:04

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

代码语言:javascript
复制
sorted(tempdb, key=lambda x: tuple(map(int, x[0].split('-')[::-1])))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54388606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档