保持结构元素最新的最佳方法

时间:2015-01-31 21:00:15

标签: python python-2.7

如果标题不清楚,请注意。我没有更好的主意。

我想在Python中存储条目的“列表”。条目包含日期和位置。我想要做的就是通过定期删除超过24小时的所有条目来保持列表的最新状态。

存储条目的最佳方式是什么(词典词典,词典列表......),以及如何删除旧项目?

5 个答案:

答案 0 :(得分:2)

我使用了元组列表。或者,您可以定义一个类来表示条目。我经常使用collections模块的namedtuple来处理这类事情。

import datetime
import collections

Entry = collections.namedtuple('Entry', ['date', 'location'])

entries = []

entries.append(Entry(datetime.datetime.now(), "Siberia"))
entries.append(Entry(datetime.datetime.now(), "Wisconsin"))

对于清除,您可以利用由timedelta阈值限定的生成器表达式。在这里,我使用切片分配来修改列表,以保持原始entries引用不变。

threshold = datetime.timedelta(days=1)
now = datetime.datetime.now()
entries[:] = (e for e in entries if now - e.date < threshold)

答案 1 :(得分:0)

您可以使用列表列表或对象列表(类)。

你会这样做:

class Entry:
    def __init__(self, date, location):
        self.date = date
        self.location = location

mylist = []
mylist.append(Entry(some_date, some_location))

其中some_date和some_location是实际的日期和位置。

答案 2 :(得分:0)

当您只需存储两个值时,无需课程:

data = []
#add elements:
data.append(("New York", "2013-10-31"))
data.append(("Washington", "2014-10-31"))
#cleanup (insert fancier date handling method here):
data = [element for element in data if element[0][:4] == "2014"]

答案 3 :(得分:0)

我会这样试试:

from datetime import datetime
from datetime import timedelta
class Entry:
    def __init__(self, date, location):
    self.date = date
    self.location = location

    def age(self):
        return datetime.now() - self.date

对于删除部分,这是一个例子:

mylist = []
mylist.append(Entry(datetime.now(), 'here'))
mylist.append(Entry(datetime.now()-timedelta(hours=24), 'here'))
mylist.append(Entry(datetime.now()-timedelta(hours=26), 'here'))
#Show all entries
for i in mylist:
    print(i.age())
#delete entries older than 24 hours
mylist = [x for x in mylist if x.age() < timedelta(hours=24)]
#Show again :)
for i in mylist:
    print(i.age())

答案 4 :(得分:0)

这种方式似乎比其他提案更简单,更快捷。你必须比较日期和时间。让我们假设您有一个元组列表,每个元组都有两个条目:日期和位置。由于您将使用&#34;追加&#34;将新元组添加到列表末尾,因此当您到达日期不再是24小时的地方时,您可以停止删除。每次添加新元组时清除列表都会使列表保持较小并且工作量(时间)也会很小。如果您使用不按时间顺序排列的列表启动项目,则可以进行一次性排序以实现此目的。

from datetime import timedelta
from datetime import datetime

n = datetime.now() - timedelta(days = 1)

for i in range(len(myList)):
    if myList[i][0] < n:
        del myList[i]
    else:
        break