Python 如何在嵌套列表中使用dateutil?
有人知道如何在嵌套列表中使用dateutil吗? 我试过了,但没有成功:Python 如何在嵌套列表中使用dateutil?,python,sorting,date,python-3.x,Python,Sorting,Date,Python 3.x,有人知道如何在嵌套列表中使用dateutil吗? 我试过了,但没有成功: r = [['21-09-1995', 3], ['22-11-1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]] 错误:“列表”对象没有属性“读取” 我知道还有其他方法可以对日期进行排序,但我喜欢dateutils的一点是,它可以识别日期而不指示格式。p、 e.21/09/1995和21-09-1995被视为日期 预期产出: from dateu
r = [['21-09-1995', 3], ['22-11-1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
错误:“列表”对象没有属性“读取”
我知道还有其他方法可以对日期进行排序,但我喜欢dateutils的一点是,它可以识别日期而不指示格式。p、 e.21/09/1995
和21-09-1995
被视为日期
预期产出:
from dateutil.parser import parse
r = sorted(r, key=parse)
或
这项工作:
r = [['07-01-1988', 6], ['21-09-1995', 3], ['22-11-1995', 2], ['12-12-2001', 5], ['test', 4]]
输出:
from datetime import datetime
from dateutil.parser import parse
def my_parse(lis):
try:
return parse(lis[0])
except ValueError:
return datetime(1, 1, 1)
print(sorted(r, key=my_parse))
r = [['21-09-1995', 3], ['22-11-1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
def srt(x):
try:
return int("".join(x[0].split("-")[::-1]))
except ValueError:
return 0
r.sort(key=srt)
r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
import re
reg = re.compile("[\-/]")
r.sort(key=lambda x: "".join(reg.split(x[0])[::-1]))
reg = re.compile("[\-/\s]")
r = ['test', '02/03/2015 test', '02/09/2016 test', '12/11/2011 test', '22/01/2015 test', '22/01/2010 test', '22/01/2013 test']
def srt(x):
try:
print(reg.split(x))
return int("".join(reg.split(x)[:3][::-1]))
except ValueError:
return 0
r.sort(key=srt)
print(r)
您需要将子列表的第一个条目输入到parse()
。条目test
不可解析,并触发ValueError
。捕获它并返回一个超出预期日期范围的datetime对象
使用:
如果您想将test
作为排序结果中的最后一个条目
编辑
如果希望它与平面列表或嵌套列表一起使用,可以检查条目是否为字符串:
return datetime(9999, 1, 1)
这假设
value
是一个包含字符串的iterable或字符串。您根本不需要dateutil,只需将日期更改为整数,以便从年份开始:
r = ['test', '21-09-1995 wednesday', '07-01-1988 tuesday']
from datetime import datetime
from dateutil.parser import parse
def my_parse(value):
try:
if isinstance(value, str):
return parse(value)
else:
return parse(value[0])
except ValueError:
return datetime(1, 1, 1)
print(sorted(r, key=my_parse))
输出:
from datetime import datetime
from dateutil.parser import parse
def my_parse(lis):
try:
return parse(lis[0])
except ValueError:
return datetime(1, 1, 1)
print(sorted(r, key=my_parse))
r = [['21-09-1995', 3], ['22-11-1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
def srt(x):
try:
return int("".join(x[0].split("-")[::-1]))
except ValueError:
return 0
r.sort(key=srt)
r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
import re
reg = re.compile("[\-/]")
r.sort(key=lambda x: "".join(reg.split(x[0])[::-1]))
reg = re.compile("[\-/\s]")
r = ['test', '02/03/2015 test', '02/09/2016 test', '12/11/2011 test', '22/01/2015 test', '22/01/2010 test', '22/01/2013 test']
def srt(x):
try:
print(reg.split(x))
return int("".join(reg.split(x)[:3][::-1]))
except ValueError:
return 0
r.sort(key=srt)
print(r)
如果您不介意将文本字符串排序到末尾,则更简单:
[['test', 4], ['07-01-1988', 6], ['21-09-1995', 3], ['22-11-1995', 2], ['12-12-2001', 5]]
这将给你:
r.sort(key=lambda x: "".join(x[0].split("-")[::-1]))
对于不同的格式:
['07-01-1988', 6], ['21-09-1995', 3], ['22-11-1995', 2], ['12-12-2001', 5], ['test', 4]]
输出:
from datetime import datetime
from dateutil.parser import parse
def my_parse(lis):
try:
return parse(lis[0])
except ValueError:
return datetime(1, 1, 1)
print(sorted(r, key=my_parse))
r = [['21-09-1995', 3], ['22-11-1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
def srt(x):
try:
return int("".join(x[0].split("-")[::-1]))
except ValueError:
return 0
r.sort(key=srt)
r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
import re
reg = re.compile("[\-/]")
r.sort(key=lambda x: "".join(reg.split(x[0])[::-1]))
reg = re.compile("[\-/\s]")
r = ['test', '02/03/2015 test', '02/09/2016 test', '12/11/2011 test', '22/01/2015 test', '22/01/2010 test', '22/01/2013 test']
def srt(x):
try:
print(reg.split(x))
return int("".join(reg.split(x)[:3][::-1]))
except ValueError:
return 0
r.sort(key=srt)
print(r)
您可以看到,即使使用正则表达式,也有很大的不同:
[['07-01-1988', 6], ['21-09-1995', 3], ['22/11/1995', 2], ['12-12-2001', 5], ['test', 4]]
如果您有一个简单的列表和字符串,如“07-01-1988星期二”:
r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
r.sort(key=my_parse)
...:
10000 loops, best of 3: 185 µs per loop
In [5]:
In [5]: %%timeit
r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
r.sort(key=lambda x: "".join(reg.split(x[0])[::-1]))
...:
100000 loops, best of 3: 6.56 µs per loop
In [7]: %%timeit
r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
r.sort(key=regex_srt)
...:
100000 loops, best of 3: 10.3 µs per loop
输出:
from datetime import datetime
from dateutil.parser import parse
def my_parse(lis):
try:
return parse(lis[0])
except ValueError:
return datetime(1, 1, 1)
print(sorted(r, key=my_parse))
r = [['21-09-1995', 3], ['22-11-1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
def srt(x):
try:
return int("".join(x[0].split("-")[::-1]))
except ValueError:
return 0
r.sort(key=srt)
r = [['21-09-1995', 3], ['22/11/1995', 2] , ['07-01-1988', 6], ['test', 4], ['12-12-2001', 5]]
import re
reg = re.compile("[\-/]")
r.sort(key=lambda x: "".join(reg.split(x[0])[::-1]))
reg = re.compile("[\-/\s]")
r = ['test', '02/03/2015 test', '02/09/2016 test', '12/11/2011 test', '22/01/2015 test', '22/01/2010 test', '22/01/2013 test']
def srt(x):
try:
print(reg.split(x))
return int("".join(reg.split(x)[:3][::-1]))
except ValueError:
return 0
r.sort(key=srt)
print(r)
r=sorted(r,key=lambda值:parse(值[0]))
@PeterWood,谢谢Peter。当我从上面的列表中删除子列表['test',4]
时,它会进行排序。如果没有,则会出现以下错误:ValueError:Unknown string format
OP:dateutils的优点是它识别日期而不指示格式。p、 e.21/09/1995和21-09-1995被视为日期。@MikeMüller,输入中没有其他类型,这也比尝试解析快得多dates@PadraicCunningham,谢谢你的回答。我刚刚用这个列表检查了您的上一个函数r['test'、'02/03/2015 test'、'02/09/2016 test'、'12/11/2011 test'、'22/01/2015 test'、'22/01/2010 test'、'22/01/2013 test']
,但它似乎不起作用。@padraickenningham,如果其中一行包含这样的日期:2012年2月4日或2012年2月4日,它就不起作用了。这就解决了我的问题。只是想知道,如果未来列表不是嵌套列表,我需要更改什么<代码>返回解析(lis[0])-->返回解析(lis)
和返回日期时间(1,1,1)
-->?你说得对。当我在日期后添加更多文本时,它不起作用。[‘测试’、‘1988年1月7日星期二’、‘1995年9月21日星期三’]