Python создает список объектов из нескольких файлов, показывающих пересечение - PullRequest
0 голосов
/ 06 января 2012

Я читаю из двух файлов (списков даты и времени), называемых A и B. (не обязательно по порядку)

Я бы хотел создать список этих datetime в виде объектов:

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

a должно быть установлено в значение true, если дата-время существует в файле A, и b в значение true, если время-дата существует в файле B. (в противном случае - 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, помещаю дату и время в список A:

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, проверка наличия каждого элемента в списке A и добавление в список объектов 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) и set (B) - я должен использовать это?

Ответы [ 2 ]

1 голос
/ 06 января 2012

Да, использование наборов - хорошая идея. Возьмите set(A) и set(B), затем:

list_of_objects = [(i, i in A, i in B) for i in set(A) | set(B)]
1 голос
/ 06 января 2012

Не вдаваясь в подробности о том, как вы читаете файл, давайте создадим два набора даты-времени, присутствующих в файлах A и 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)

Теперь создайте два оставшихся набора, которые будут содержать элементы, которые присутствуют исключительно в файлах A и B

setAOnly=setA-setAB
setBOnly=setB-setAB

Теперь, наконец, создайте список объектов. Обратите внимание, что теперь мы классифицировали элементы на три разных набора, нам не нужно искать, а можно жестко закодировать значения a и b в классе 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...