Python 如何在排序函数中忽略无效输入或添加try-except代码?
我想根据日期对词典列表进行排序 以下代码在我的数据格式为fix(即dd/mm/yyyy)的情况下工作正常 代码: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 [
[{'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
?您可以从输出列表中删除这些项,将它们放在开头、结尾或任意与其他项混合-但如果删除它们,排序列表的长度将与原始列表的长度不同。。。