我有一个列表清单如下:
A = [['05-22-2013', '0.5553', '0.887', '0.14'],
['05-22-2013', '0.3442', '0.345', '0.0'],
['05-22-2013', '0.3', '0.7', '0.4'],
['05-23-2013', '0.53', '0.87', '0.4'],
['05-23-2013', '0.9', '0.8', '0.1'],
['05-23-2013', '0.0', '0.799', '0.214'],
['05-24-2013', '0.053', '0.7', '0.1422'],
['05-25-2013', '0.5', '0.110', '0.200'],
['05-25-2013', '0.311', '0.799', '0.426'],
['05-25-2013', '0.311', '0.091', '0.41']]
我想选择'05 -22-2013'到'05 -24-2013'日期之间的所有元素。我正在尝试手动获取对应于数组中每个日期的所有元素,并将它们全部附加到单个列表列表中。喜欢一个约会:
date_1 = []
for u in A:
if '05-22-2013' in u:
date_1.append(u)
那么,具体说明一下,获取给定日期范围内所有项目的最佳方法是什么(在这种列表列表中)?
答案 0 :(得分:3)
我不知道这是否是“最佳”方式,因为说实话,“最好”是一个非常主观的术语。
from datetime import date
start_date = date(2013, 5, 22)
end_date = date(2013, 5, 24)
data = []
for i in A:
month, day, year = i[0].split('-')
record_date = date(year, month, day)
if record_date >= start_date and record_date <= end_date:
data.append(i)
答案 1 :(得分:2)
要简单地获取与给定日期匹配的所有列表条目,您可以构建列表解析:
print [entry for entry in A if entry[0] == '05-25-2013']
返回值:
[['05-25-2013', '0.5', '0.110', '0.200'], ['05-25-2013', '0.311', '0.799', '0.426'], ['05-25-2013', '0.311', '0.091', '0.41']]
这种方法当然只涉及一个日期,但可以在if
中进行修改以处理其他日期。缺点是您必须明确列出范围内的每个日期,因为它们都被解释为纯粹的字符串。
但是,如果你真的需要能够进入一个范围,你必须得到更多的深度并且可能使用datetime
模块,这会将其转换为能够使用{{1}的数据类型和>
- 类似的运营商。
答案 2 :(得分:0)
如果线性时间预处理是一个选项,那么首先将键(日期)输出到一个单独的列表中。要使它们可订购,请先将它们转换为datetime
个对象。
>>> from datetime import datetime
>>> def parsedate(s):
... return datetime.strptime(s, '%M-%d-%Y')
>>> keys = [parsedate(x[0]) for x in A]
然后你可以廉价地进行二元搜索(在O(lg n)时间内)进行范围搜索:
>>> from bisect import bisect_left, bisect_right
>>> left = bisect_left(keys, parsedate('05-22-2013'))
>>> right = bisect_right(keys, parsedate('05-24-2013'))
现在A[left:right]
是您正在寻找的范围。