Python: использование itertools для получения предыдущего, текущего и следующего элемента в списке из текстового файла - PullRequest
1 голос
/ 08 января 2012

Я настроил свой код, как указано в этот ответ (показан ниже):

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

1 Ответ

3 голосов
/ 08 января 2012

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

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

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

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

...