0

我有一个列表,如下所示:

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)

因此,特别说明,在给定日期范围内(在这种列表列表中)获取所有项目的最佳方法是什么?

4

3 回答 3

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)
于 2013-05-28T16:02:33.863 回答
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模块,该模块会将其转换为能够使用>和类似<运算符的数据类型。

于 2013-05-28T15:54:31.047 回答
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]是您正在寻找的范围。

于 2013-05-28T16:00:16.890 回答