【问题标题】:Python create list of objects from multiple files showing intersectionPython从显示交集的多个文件创建对象列表
【发布时间】:2012-01-06 03:36:51
【问题描述】:

我正在读取名为 A 和 B 的两个文件(日期时间列表)。(不一定按顺序)

我想将这些日期时间的列表创建为对象:

class AB(object):
    def __init__(self, datetime, a=False, b=False):
        self.datetime = datetime
        self.a = a
        self.b = b

如果日期时间存在于文件 A 中,a 应设置为真,如果日期时间存在于文件 B 中,则 b 为真。(否则为假)

例如:

文件 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 中是否存在每个项目,并将 B-only 和 A+B 项目添加到 listObjects:

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) 和 set(B) 获得列表的交集 - 我应该使用这个吗?

【问题讨论】:

    标签: python list datetime compare


    【解决方案1】:

    是的,使用集合是个好主意。取set(A)set(B) 然后:

    list_of_objects = [(i, i in A, i in B) for i in set(A) | set(B)]
    

    【讨论】:

      【解决方案2】:

      不详细说明您是如何读取文件的,让我们在 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]
      

      【讨论】:

      • 感谢您的回答和解释 - 比我这样做的方式好得多!但是,我选择了@Benjamin's 作为接受的答案,因为它是一种单行解决方案——我认为这是不可能的!
      猜你喜欢
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      相关资源
      最近更新 更多