Python从显示交集的多个文件中创建对象列表

时间:2012-01-06 03:36:51

标签: python list datetime compare

我正在读取两个文件(日期时间列表),称为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) - 我应该使用它吗?

2 个答案:

答案 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类中的值ab进行硬编码。

[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)]