У меня есть два объекта, один из которых представляет собой список кортежей с (int, str)
, например:
first_input = [
(0 , "Lorem ipsum dolor sit amet, consectetur"),
(1 , " adipiscing elit"),
(0 , ". In pellentesque\npharetra ex, at varius sem suscipit ac. "),
(-1 , "Suspendisse luctus\ncondimentum velit a laoreet. "),
(0 , "Donec dolor urna, tempus sed nulla vitae, dignissim varius neque.")
]
# Note that the strings contain newlines `\n` on purpose.
Другой объект - это строка, которая является результатом серии операций (* ), что по замыслу приведет к объединению всех вышеперечисленных строк, но с некоторыми дополнительными вставками новой строки \n
.
(*: очевидно, что этого нельзя сделать при сохранении структуры list of tuples
)
Например:
second_input = "Lorem ipsum dolor sit amet,\nconsectetur adipiscing elit. In pellentesque\npharetra ex, at varius sem\nsuscipit ac. Suspendisse luctus\ncondimentum velit a laoreet. Donec dolor urna, tempus sed\nnulla vitae, dignissim varius neque."
# Note that there are 3 new newlines, here ^ for instance
# but also in "sem\nsuscipit" and "sed\nnulla"
Моя цель - go вернуться к первой структуре, но с сохранением дополнительных символов новой строки. Итак, в моем примере я бы получил:
expected_output = [
(0 , "Lorem ipsum dolor sit amet,\nconsectetur"), # new newline here
(1 , " adipiscing elit"),
(0 , ". In pellentesque\npharetra ex, at varius sem\nsuscipit ac. "), # new newline here
(-1 , "Suspendisse luctus\ncondimentum velit a laoreet. "),
(0 , "Donec dolor urna, tempus sed\nnulla vitae, dignissim varius neque.") # new newline here
]
Есть ли у вас разумный способ сделать это, кроме восстановления строки с символом путем сравнения символов?
(NB: I неважно, в каком из двух кортежей он заканчивается, если новый \n
находится на границе строки. Например, получение [(0, "foo\n"), (1, "bar")]
или [(0, "foo"), (1, "\nbar")]
не имеет значения.)
Изменить: чего я хочу избежать, так это сделать что-то вроде этого:
position=0
output = []
for tup in first_input:
reconstructed_string = ""
for letter in tup[1]:
if letter == second_input[position]:
reconstructed_string = reconstructed_string + letter
else:
reconstructed_string = reconstructed_string + second_input[position]
position +=1
output.append((tup[0], reconstructed_string))
# Note: this is hastily written to give you an idea, I have no idea if it would work properly, probably not
# Well, it does seem to work without bug, at least in my example. That's unexpected lol. Anyway, if you can think of a better solution...!
То есть, просматривая каждый символ строк и сравнивая их, чтобы восстановить строки символ за символом .