如果标题不清楚,请注意。我没有更好的主意。
我想在Python中存储条目的“列表”。条目包含日期和位置。我想要做的就是通过定期删除超过24小时的所有条目来保持列表的最新状态。
存储条目的最佳方式是什么(词典词典,词典列表......),以及如何删除旧项目?
答案 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