Редактирование списка в Python - PullRequest
0 голосов
/ 06 августа 2020

Вот код, который я написал:

lines = ['add something to this line',
         'add nothing to this one',
         'emphasize this line',
         'emphasize nothing, instead remove a "count" number of characters from the end']

count = 0
new_lines = []
for n,line in enumerate(lines):
    if n > 0:
        if lines[n-1][:4] == line[:4]:
            new_lines.pop(-1)
            new_lines.append(lines[n-1] + '!!!')
            count += 3
    elif n == len(lines)-1:
        line = line[:-count]
    new_lines.append(line)

new_lines подходит, но для последней строки. Разве это не должно быть усечено?

['add something to this line!!!',
 'add nothing to this one',
 'emphasize this line!!!',
 'emphasize nothing, instead remove a "count" number of characters from the end']

РЕДАКТИРОВАТЬ: Я хотел написать len(lines), а не len(new_lines)

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Посмотрите на свой лог c:

if n > 0:
    ...
elif n == len(new_lines)-1:
    line = line[:-count]

Прежде всего, это может работать только на первой строке списка: после этого n положительно , поэтому вы не дойдете до этой части else. Для строки, которую вы ожидаете изменить, n равно 3, поэтому вы застряли в предложении if/True.

Далее, n всегда равно len (new_lines в этой точке). Ваше условие elif алгебраически неверно.

Если вы хотите изменить последнюю строку, попробуйте

if n == len(lines)-1:

Вывод:

add something to this line!!!
add nothing to this one
emphasize this line!!!
emphasize nothing, instead remove a "count" number of characters from t
1 голос
/ 06 августа 2020

Нет, потому что elif n == len(new_lines)-1: никогда не будет True. Вот фактические значения:

n, len(new_lines)-1
0, -1
1, 0
2, 1
3, 2

После первой итерации if n > 0: всегда будет True, поэтому вы никогда не войдете в этот блок: elif n == len(lines)-1:. Измените elif на if, и вы получите желаемое поведение.

...