#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)