Удалять и объединять элементы из списка во время итерации - PullRequest
0 голосов
/ 05 августа 2020

Я работаю с python, и у меня есть следующий список:

mylist = ['Module(stmt* body, type_ignore *type_ignores)', '| Interactive(stmt* body)', 'FunctionDef(identifier name, arguments args,','stmt* body, expr* decorator_list, expr? returns,','string? type_comment)']

Я хочу объединить один элемент списка с предыдущим, если второй элемент не заканчивается ) и предыдущий элемент не начинается с |, тогда удалите второй элемент. Например, mylist следует преобразовать как:

mylist = ['Module(stmt* body, type_ignore *type_ignores)', '| Interactive(stmt* body)', 'FunctionDef(identifier name, arguments args, stmt* body, expr* decorator_list, expr? returns, string? type_comment)']

Я написал следующий рекурсивный код:

def test(line1, line2):
    if line1[-1] != ')' and line2[0] != '|':
       return True, line1 + line2
else:
    return False, line1


def concat_rule(lines):
    for index in range(len(lines)):
        if index + 1 >= len(lines):
            return lines
        value = test(lines[index], lines[index + 1])
        if value[0]:
            lines[index] = value[1]
            del lines[index + 1]
            break
    if value[0]:
        return concat_rule(lines)

Он работает, но мне интересно, существует ли простейшее решение с всеобъемлющим список.

1 Ответ

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

Нет необходимости в рекурсии - вы можете использовать простой l oop. (Я не уверен, может ли здесь помочь понимание списка.)

Вот версия, которая модифицирует на месте:

index = 1
while index < len(mylist):
    if mylist[index - 1][-1] != ')' and mylist[index][0] != '|':
        mylist[index - 1] += mylist.pop(index)
    else:
        index += 1

и вот версия, которая делает список:

output = [mylist[0]]
for item in mylist[1:]:
    if output[-1][-1] != ')' and item[0] != '|':
        output[-1] += item
    else:
        output.append(item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...