我有两个对象,一个是带有(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"
我的目标是回到第一个结构,但保留额外的换行符。在我的例子中,我会得到:
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
]
除了通过逐个字符的比较来重建字符串之外,您还有其他聪明的方法吗
(注意:如果一个新的\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...!
也就是说,遍历字符串的每个字符并比较它们以逐个字符地重建字符串
我认为最简单的方法是将你在组合字符串上执行的任何操作转换回片段,但我想你已经想到了这一点。 相反,不能插入任何换行符,而是生成一个位置列表,在该列表中输入这些换行符。跟踪字符串位的长度,假设变量
posis
中存储了将“”替换为“\n”的位置,则可能如下所示:这不是很漂亮,但它适用于样本,为了进行适当的测试,我需要一些关于可能情况的更多信息,可能还有确定换行位置的操作
好的,考虑到没有字符被替换或修改(如OP所述),我可以得出以下结论:
解释:你不必跟踪新线或类似的东西。此外,“first_input”中的换行符并不重要,因为我们在第二个输入中有所有换行符(加上更多换行符)
因此,只需获取
first_input_no_newline
的每个项目的长度,如果其中没有换行符,这也应该是second_input
中的子字符串的长度,但是,如果有换行符,好的,只需继续计数并从第二个\u输入的副本中删除它们,并将此结果作为偏移量添加到原始第二个\u输入输入示例(修复了OP的原始输入,在某些短语之间添加缺少的白色字符):
输出:
我会这样做——用糟糕的代码编写。我写得很匆忙
相关问题 更多 >
编程相关推荐