Как объединить элементы в списке на основе первых двух символов следующего элемента в списке

#python #list

#python #Список

Вопрос:

У меня есть этот код, вдохновленный другими, который теперь успешно объединяет элементы, начинающиеся с ‘##’, с предыдущим элементом в списке. Однако у меня странное поведение, когда последний элемент исчезает.

Список:

 tokens = ['Hello', 'this', 'is', 'a', 's', '##e', '##ntenc', '##e']
 

Проверка, является ли что-то вложенным (с ##)

 def is_subtoken(string):
    if string[:2] == "##":
        return True
    else:
        return False
 

Слияние токенов

 merged_text = []
for i in range(len(tokens)):
    if not is_subtoken(tokens[i]) and (i 1)<len(tokens) and is_subtoken(tokens[i 1]):
        merged_text.append(tokens[i]   tokens[i 1][2:])
        if (i 2)<len(tokens) and is_subtoken(tokens[i 2]):
            merged_text[-1] = merged_text[-1]   tokens[i 2][2:]
    elif not is_subtoken(tokens[i]):
        merged_text.append(tokens[i])

print(merged_text)
 

Это вывод:

 ['Hello', 'this', 'is', 'a', 'sentenc']
 

В то время как ожидалось:

 ['Hello', 'this', 'is', 'a', 'sentence']
 

Я не могу разобраться в этом. Есть ли что-то недостающее, необходимое для объединения множества этих элементов «##»?

Большое вам спасибо.

Ответ №1:

вы могли бы просто использовать join, replace и split довольно легко:

 '|'.join(tokens).replace('|##', '').split('|')
 

редактировать: вам не хватает последнего элемента, потому что вы никогда не добавляете его, если только это не токен

Комментарии:

1. Очень просто, и это сработало потрясающе. Спасибо!

2. Когда есть "|" в исходной строке, это приведет к некоторым ошибкам.

3. да, вы можете использовать любой разделитель, который вы хотите, например delim = 37 * '| -' . вероятно, его не должно быть ни в одной строке.

Ответ №2:

Ваша обработка кажется более сложной, чем это должно быть.

 merged = []
for token in tokens:
    if token.startswith('##') and merged:
        merged[-1]  = token[2:]
    else:
        merged.append(token)