Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在嵌套列表中使用dateutil?_Python_Sorting_Date_Python 3.x - Fatal编程技术网

Python 如何在嵌套列表中使用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

有人知道如何在嵌套列表中使用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 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日星期三’]