Python 如何在排序函数中忽略无效输入或添加try-except代码?

Python 如何在排序函数中忽略无效输入或添加try-except代码?,python,lambda,sorted,Python,Lambda,Sorted,我想根据日期对词典列表进行排序 以下代码在我的数据格式为fix(即dd/mm/yyyy)的情况下工作正常 代码: [{'date': '10/10/2015'}, {'date': '11/10/2015'}, {'date': '01/01/2015'}, {'date': '10/12/2014'}, {'date': '01/01/2014'}, {'date': '2015'}] In [20]: a.pop() Out[20]: {'date': '2015'} In [

我想根据日期对词典列表进行排序

以下代码在我的数据格式为fix(即dd/mm/yyyy)的情况下工作正常

代码:

[{'date': '10/10/2015'},
 {'date': '11/10/2015'},
 {'date': '01/01/2015'},
 {'date': '10/12/2014'},
 {'date': '01/01/2014'},
 {'date': '2015'}]

In [20]: a.pop()
Out[20]: {'date': '2015'}

In [21]: sorted(a, key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)
Out[21]: 
[{'date': '01/01/2014'},
 {'date': '10/12/2014'},
 {'date': '01/01/2015'},
 {'date': '10/10/2015'},
 {'date': '11/10/2015'}]
In [22]: a.append({"date":"2015"})

In [23]: sorted(a, key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-23-abd07eed54eb> in <module>()
----> 1 sorted(a, key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)

<ipython-input-23-abd07eed54eb> in <lambda>(x)
----> 1 sorted(a, key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)

/usr/lib/python2.7/_strptime.py in _strptime(data_string, format)
    323     if not found:
    324         raise ValueError("time data %r does not match format %r" %
--> 325                          (data_string, format))
    326     if len(data_string) != found.end():
    327         raise ValueError("unconverted data remains: %s" %

ValueError: time data '2015' does not match format '%d/%m/%Y'

In [24]: 
但在中,我也有与dd/mm/yyyy格式不匹配的日期值。 获取以下异常:

代码2:

[{'date': '10/10/2015'},
 {'date': '11/10/2015'},
 {'date': '01/01/2015'},
 {'date': '10/12/2014'},
 {'date': '01/01/2014'},
 {'date': '2015'}]

In [20]: a.pop()
Out[20]: {'date': '2015'}

In [21]: sorted(a, key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)
Out[21]: 
[{'date': '01/01/2014'},
 {'date': '10/12/2014'},
 {'date': '01/01/2015'},
 {'date': '10/10/2015'},
 {'date': '11/10/2015'}]
In [22]: a.append({"date":"2015"})

In [23]: sorted(a, key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-23-abd07eed54eb> in <module>()
----> 1 sorted(a, key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)

<ipython-input-23-abd07eed54eb> in <lambda>(x)
----> 1 sorted(a, key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)

/usr/lib/python2.7/_strptime.py in _strptime(data_string, format)
    323     if not found:
    324         raise ValueError("time data %r does not match format %r" %
--> 325                          (data_string, format))
    326     if len(data_string) != found.end():
    327         raise ValueError("unconverted data remains: %s" %

ValueError: time data '2015' does not match format '%d/%m/%Y'

In [24]: 
[22]中的
:a.append({“日期”:“2015”})
在[23]中:已排序(a,key=lambda x:datetime.datetime.strtime(x['date'],%d/%m/%Y),反向=False)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1已排序(a,key=lambda x:datetime.datetime.strtime(x['date'],%d/%m/%Y),反向=False)
in(x)
---->1已排序(a,key=lambda x:datetime.datetime.strtime(x['date'],%d/%m/%Y),反向=False)
/usr/lib/python2.7//u strptime.py in.\u strptime(数据字符串,格式)
323如果未找到:
324 raise VALUERROR(“时间数据%r与格式%r不匹配”%
-->325(数据字符串,格式))
326如果len(数据字符串)!=已找到。结束()
327 raise VALUE ERROR(“未转换的数据保留:%s”%
ValueError:时间数据“2015”与格式“%d/%m/%Y”不匹配
在[24]中:
如何在
排序
功能中处理此类输入???

我们的数据:

In [51]: a = [{'date': '10/10/2015'},
   ....:  {'date': '11/10/2015'},
   ....:  {'date': '01/01/2015'},
   ....:  {'date': '10/12/2014'},
   ....:  {'date': '01/01/2014'},
   ....:  {'date': '2015'}]
首先从
a

In [52]: a = [i for i in a if len(i['date'])>9]
第二:

In [53]: sorted(a, key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)
Out[53]: 
[{'date': '01/01/2014'},
 {'date': '10/12/2014'},
 {'date': '01/01/2015'},
 {'date': '10/10/2015'},
 {'date': '11/10/2015'}]
您可以将其写入一行:

sorted([i for i in a if len(i['date'])>9], key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)
我们的数据:

In [51]: a = [{'date': '10/10/2015'},
   ....:  {'date': '11/10/2015'},
   ....:  {'date': '01/01/2015'},
   ....:  {'date': '10/12/2014'},
   ....:  {'date': '01/01/2014'},
   ....:  {'date': '2015'}]
首先从
a

In [52]: a = [i for i in a if len(i['date'])>9]
第二:

In [53]: sorted(a, key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)
Out[53]: 
[{'date': '01/01/2014'},
 {'date': '10/12/2014'},
 {'date': '01/01/2015'},
 {'date': '10/10/2015'},
 {'date': '11/10/2015'}]
您可以将其写入一行:

sorted([i for i in a if len(i['date'])>9], key=lambda x: datetime.datetime.strptime(x['date'], "%d/%m/%Y"), reverse=False)

一个选项是处理键函数中的异常:

def custom_sort(x):
    try:
        return datetime.datetime.strptime(x['date'], "%d/%m/%Y")
    except ValueError:
        # do something else if the date format is different
    except KeyError:
        # do something else if there is no 'date' key in x
        # ...

sorted(a, key=custom_sort)
或者,在应用日期时间函数之前,可以使用
if-else
构造将数据转换为正确的格式


编辑:这里有两个更实用的选项:

a = [{'date': '05/06/2017'}, {'ff': 2016}, {'date': 2015}, {'date': '05/06/2014'}, 'ff']

def sort_by_converting_to_strings(x):
    try:
        return str(datetime.datetime.strptime(x['date'], "%d/%m/%Y"))
    except (KeyError, ValueError, TypeError):
        try:
            return str(x['date'])
        except (KeyError, TypeError):
                return str(x)
print sorted(a, key=sort_by_converting_to_strings)
# [{'date': '05/06/2014'}, {'date': 2015}, {'date': '05/06/2017'}, 'ff', {'ff': 2016}]


def validate(x):
    try:
        datetime.datetime.strptime(x['date'], "%d/%m/%Y")
        return True
    except Exception:
        return False
print sorted([i for i in a if validate(i)])
# [{'date': '05/06/2014'}, {'date': '05/06/2017'}]

当然,您可以结合这些方法来获得适合您特定用例的解决方案…

一个选项是处理关键功能中的异常:

def custom_sort(x):
    try:
        return datetime.datetime.strptime(x['date'], "%d/%m/%Y")
    except ValueError:
        # do something else if the date format is different
    except KeyError:
        # do something else if there is no 'date' key in x
        # ...

sorted(a, key=custom_sort)
或者,在应用日期时间函数之前,可以使用
if-else
构造将数据转换为正确的格式


编辑:这里有两个更实用的选项:

a = [{'date': '05/06/2017'}, {'ff': 2016}, {'date': 2015}, {'date': '05/06/2014'}, 'ff']

def sort_by_converting_to_strings(x):
    try:
        return str(datetime.datetime.strptime(x['date'], "%d/%m/%Y"))
    except (KeyError, ValueError, TypeError):
        try:
            return str(x['date'])
        except (KeyError, TypeError):
                return str(x)
print sorted(a, key=sort_by_converting_to_strings)
# [{'date': '05/06/2014'}, {'date': 2015}, {'date': '05/06/2017'}, 'ff', {'ff': 2016}]


def validate(x):
    try:
        datetime.datetime.strptime(x['date'], "%d/%m/%Y")
        return True
    except Exception:
        return False
print sorted([i for i in a if validate(i)])
# [{'date': '05/06/2014'}, {'date': '05/06/2017'}]

当然,您可以结合这些方法来获得适合您的特定用例的解决方案…

谢谢,但是
SyntaxError:invalid syntax
谢谢,但是
SyntaxError:invalid syntax
Up-Voted+1是的,我还创建了只将有效日期格式返回到排序函数的函数。即,对输入列表进行预处理s在排序函数中有任何方法可以忽略这些输入项。
自定义排序
在执行
排序
函数期间应用,与匿名lambda的方式相同,它不是预处理输入列表,也就是说,它不更新任何值……或者您需要plz的确切内容是什么?您所说的
忽略?您可以从输出列表中删除这些项目,将它们放在开头、结尾或任意与其他项目混合-但如果删除它们,排序列表将不会具有与原始列表相同的长度…向上投票+1是,我还创建了只将有效日期格式返回到排序函数的函数。即,对输入进行预处理列表。排序函数中是否有任何方法可以忽略此类输入项?
自定义排序
在执行
排序
函数期间应用,与匿名lambda的方式相同,它不预处理输入列表,即不更新任何值…或者您到底需要plz什么?您所说的
i是什么意思gnore
?您可以从输出列表中删除这些项,将它们放在开头、结尾或任意与其他项混合-但如果删除它们,排序列表的长度将与原始列表的长度不同。。。