我正在读取两个文件(日期时间列表),称为A和B.(不一定按顺序)
我想将这些日期时间列表创建为对象:
class AB(object):
def __init__(self, datetime, a=False, b=False):
self.datetime = datetime
self.a = a
self.b = b
如果日期时间存在于文件A中,则a应设置为true;如果文件B中存在datetime,则应设置为true(否则为false)
例如:
文件A:20111225,20111226
文件B:20111225,20111227
对象列表应为:
AB(20111225,a = true,b = true)
AB(20111226,a = true,b = false)
AB(20111227,a = false,b = true)
目前:
我正在阅读文件A,将日期时间放入listA:
listObjects = []
fileA = open(A.log, 'rb')
listA = []
for line in fileA:
try:
dt = datetime.strptime(line, "%Y%m%d")
except Exception, e:
continue
else:
listA.append(dt)
然后阅读文件B,检查listA中是否存在每个项目,并向listObjects添加B-only和A + B项目:
fileB = open(B.log, 'rb')
for line in fileB:
try:
dt = datetime.strptime(line, "%Y%m%d")
except Exception, e:
continue
else:
if dt in listA:
listA.remove(dt)
listObjects.append(AB(dt, a=True, b=True))
else:
listObjects.append(AB(dt, a=False, b=True))
然后我循环浏览列表A,添加剩余的仅A项:
for dt in listA:
listObjects.append(AB(dt, a=True, b=False))
然后按日期时间对列表进行排序:
shutdowns.sort(key=lambda x: x.datetime)
有更好的方法吗?这似乎有点笨拙,随着文件长度的增加,它会以指数方式变慢。
我知道你可以使用set(A)&amp ;;来获得列表的交集。 set(B) - 我应该使用它吗?
答案 0 :(得分:1)
不详细说明如何阅读文件,让我们在fileA和fileB中创建两组日期时间,如下所示
setA=set(datetime.strptime(a, "%Y%m%d") for a in fileA)
setB=set(datetime.strptime(b, "%Y%m%d") for a in fileB)
现在创建两个文件中存在的元素集
setAB=setA.intersection(setB)
现在创建剩余的两个集合,其中包含仅存在于fileA和fileB
中的元素setAOnly=setA-setAB
setBOnly=setB-setAB
现在最终创建对象列表。现在请注意,我们已将元素分为三个不同的集合,我们不需要搜索,而是可以对AB类中的值a
和b
进行硬编码。
[AB(d,True,False) for d in setAOnly] + \
[AB(d,False,True) for d in setBOnly] + \
[AB(d,True,True) for d in setAB]
答案 1 :(得分:1)
是的,使用套装是一个好主意。然后选择set(A)
和set(B)
:
list_of_objects = [(i, i in A, i in B) for i in set(A) | set(B)]