2012-01-07 1 views
1

Я установки моего кода, как описано в this answer (как показано ниже):Python: Использование itertools, чтобы получить предыдущий, текущий и следующий элемент списка из текстового файла

from itertools import tee, islice, chain, izip 

def previous_and_next(some_iterable): 
    prevs, items, nexts = tee(some_iterable, 3) 
    prevs = chain([None], prevs) 
    nexts = chain(islice(nexts, 1, None), [None]) 
    return izip(prevs, items, nexts) 

x = open('out2.txt','r') 
lines = x.readlines() 

for previous, item, next in previous_and_next(lines): 
    print "Current: ", item , "Next: ", next, "Previous: ", previous 
    if item == '0': 
     print "root" 
    elif item == '2': 
     print "doc" 
    else: 
     print "none" 

x.close() 

out2.txt выглядит следующим образом:

0 
2 
4 
6 
8 
10 

Этот код отлично работает при использовании чего-то вроде list = [0,2,4,6,8,10], но не при использовании строк текстового файла в списке. Как я могу использовать строки текстового файла в виде списка. Разве это не x.readlines()? В конечном итоге мне нужно иметь возможность печатать выходные данные в зависимости от результатов item, next, and previous.

Текущий результат:

Current: 0 
Next: 2 
Previous: None 
none 
Current: 2 
Next: 4 
Previous: 0 

none 
Current: 4 
Next: 6 
Previous: 2 

none 
Current: 6 
Next: 8 
Previous: 4 

none 
Current: 8 
Next: 10 Previous: 6 

none 
Current: 10 Next: None Previous: 8 

none 

Желаемый результат должен быть:

Current: 0 
Next: 2 
Previous: None 
**root** 

Current: 2 
Next: 4 
Previous: 0 
**doc** 

none 
Current: 4 
Next: 6 
Previous: 2 

none 
Current: 6 
Next: 8 
Previous: 4 

none 
Current: 8 
Next: 10 Previous: 6 

none 
Current: 10 Next: None Previous: 8 

none 
+3

Каким образом делает код не работает? «Это не работает нормально» - это бесполезная информация. –

+0

Добавлено то, что выглядит в настоящее время на выходе, и то, что я пытаюсь сделать так. – serk

+0

Обратите внимание, что вместо последовательности 'if's, вы можете использовать словарь для сопоставления строк (типов узлов?) Для других строк (имена узлов?). Это даже проще, если вы используете [по умолчанию словарь] (http://code.activestate.com/recipes/389639-default-dictionary/), который не является родным типом в Python, но легко реализуется. – outis

ответ

3

readlines() метод файлового объекта возвращает список строк файла включая символы новой строки. Ваши чеки сравниваются со строками, не включая символы новой строки, поэтому они всегда терпят неудачу.

Один из способов избавиться от перевода строки символов

lines = (line.strip() for line in open("out2.txt")) 

(Обратите внимание, что вам не нужно readlines() -. Вы можете непосредственно перебрать самого файла объекта)

+0

Так просто от недосмотра. Спасибо, что поняли! – serk

Смежные вопросы