Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中高效地合并两个大字符串_Python_Python 3.x_String_Git_Python 2.7 - Fatal编程技术网

在python中高效地合并两个大字符串

在python中高效地合并两个大字符串,python,python-3.x,string,git,python-2.7,Python,Python 3.x,String,Git,Python 2.7,我已经在这方面工作了几天,似乎没有我需要的答案 为了避免被标记为重复,我将解释为什么其他问题对我不起作用 使用DIFFLIB for Python的任何答案都无助于我的需要。(我将在下文详细介绍)。它完全太慢了-除非有人给我一个好的优化提示(统一的_diff模块),否则我将无法使用它 我曾尝试研究如何向需要文件的命令发送大字符串,但没有一个选项适合我。如果我能让它工作,我不介意使用这个选项(下面也有详细描述) 我不介意被标记为重复,只要这是一个真正解决我问题的问题——我已经浏览了一些网站,还没

我已经在这方面工作了几天,似乎没有我需要的答案

为了避免被标记为重复,我将解释为什么其他问题对我不起作用

  • 使用DIFFLIB for Python的任何答案都无助于我的需要。(我将在下文详细介绍)。它完全太慢了-除非有人给我一个好的优化提示(统一的_diff模块),否则我将无法使用它

  • 我曾尝试研究如何向需要文件的命令发送大字符串,但没有一个选项适合我。如果我能让它工作,我不介意使用这个选项(下面也有详细描述)

  • 我不介意被标记为重复,只要这是一个真正解决我问题的问题——我已经浏览了一些网站,还没有找到适合我的解决方案

我想在Python中合并两个大字符串。每根弦大约1.5KB。假设有两个字符串,str1和str2,我只想返回合并的字符串,它只是带有str2附加信息的str1。我不想任何东西被移除

在大多数情况下,这些字符串将相对相同。大多数情况下,这将是90%相同。不同之处在于,第二个字符串中可能添加了新信息,我希望将这些信息捕获到原始字符串中

因此

str1=“这是一个非常复杂的问题
长串和
这就是它的样子。”
str2=“这是一个非常重要的问题
这是我的例子
这就是它的样子。”
result=“这是一个非常复杂的问题
长串和
这是我的例子
这就是它的外观。”#第三行被添加到str1中
我解决这个问题的第一种方法是使用git diff。我在Windows上,我要做的是使用我将字符串输出到的临时文件执行git diff cmd,然后立即删除这些文件。我创建的cmd函数将以字符串形式返回输出(统一的diff)。然后,我会在字符串上进行后期处理,以删除diff总是添加的头。通过将输出指示符改为空格,我可以删除每一行上的“+”和“-”(为了简单起见,我从代码中使用了所有选项)

#F1和f2文本文件在此处创建
#cmd是我创建的一个函数,它使用操作系统模块执行命令
输出=cmd(“git diff-u99999-b——无索引f1.txt f2.txt”)
#f1和f2文本文件将在此处删除
我尝试过DiffLib,但速度太慢了。一个diff文件输出大约需要8-10分钟。我使用了统一的_diff模块,并将参数作为字符串和列表传递。我甚至尝试过操作源代码,但我的更改并没有让它快很多

我还尝试将字符串直接传递给git diff或只是传递给diff。但是,会有错误,抱怨“参数列表太长”。我甚至尝试将字符串发送到stdout并将其用作文件参数,但也没有多大效果


我不介意使用这些选项中的任何一个,如果它可以调整以实现我的目标非常低效,如果可以避免的话,我不想继续创建和删除文本文件。

如果您想推出自己的解决方案,您可以将每一行添加到某个列表中,一次添加一行,在第一个字符串和第二个字符串之间交替:

list_1 = "A\nB\nC\nD".split()
list_2 = "A\nE\nF\nD".split()
output = []

for i in range(len(list_1)):
    output.append(list_1[i])
    output.append(list_2[i])

for o in output:
    print(o)

>> A
>> A
>> B
>> E
>> C
>> F
>> D
>> D
然后需要从输出列表中删除重复项(不使用集合,因为集合会扰乱顺序)

我可以想到几个警告:

  • 如果
    len(list_1)!=len(list_2)
    ,您需要对此进行说明

  • 我不清楚在此上下文中“合并”的含义。例如,如果:

    list_1 == ["A", "B", "A", "D", "A", "C", "A", "D", "A", "B", "B", "B"]
    list_2 == ["B", "A", "C", "C", "A", "A", "D", "D", "A", "B", "C", "A", "D"]
    

  • 我不清楚合并结果应该是什么样子。

    在@schwobasegll的建议下,我找到了解决方案

    Diff_patch_match比difflib快光年

    对于任何可能遇到类似问题的人,以下是我面临的一些障碍以及我如何解决这些障碍:

    • 创建diff_patch_match对象时,请确保将字符串作为参数传递
    • 如果您的输入仅仅是一行,那么您不必担心我的下一点。但是,如果您的字符串是多行(由“\n”分隔),那么你必须遵循一个不同的协议。该网站是链接的。不过,我会把它放在下面,以防网站崩溃。链接的网站使用Java,但我在这里将其更改为Python

    谢谢大家的评论和回答!

    如果
    strA
    是“A\n B\n C\n D”,而
    strB
    是“A\n E\n F\D”",生成的输出应该是什么?
    A B C E F D
    A B E C F D
    ?@alex我应该在上面提供更多详细信息。这两个字符串完全相同。但是,第二个字符串定期添加信息。我想捕获新添加的信息并将其添加到原始字符串中。您尝试过吗?I可以想象你的问题太大了。你总是知道哪个字符串是“原始”的,哪个字符串有“额外”的吗添加?@JohnGordon是的,我总是知道这两个合并之间的区别。合并将相对相同。为了澄清,字符串来自我不想编辑的文件,只是从中读取。例如-file1和file2。每个文件都包含信息块。大多数情况下,这些文件都是相同的。但是,有时,会有将是一个或两个添加的信息块。因此,在您的示例中,列表永远不会有那么大的不同。它们只是在中间的某个地方包含额外的行。是的,它们可能会有不同的长度。我对字符串所做的预处理阻止我仅使用带有diff的直接文件。
    list_1 == ["A", "B", "A", "D", "A", "C", "A", "D", "A", "B", "B", "B"]
    list_2 == ["B", "A", "C", "C", "A", "A", "D", "D", "A", "B", "C", "A", "D"]
    
    def diff_lineMode(text1, text2):
      dmp = new diff_match_patch()
      a = dmp.diff_linesToChars_(text1, text2)
      lineText1 = a[0]
      lineText2 = a[1]
      lineArray = a[2]
      diffs = dmp.diff_main(lineText1, lineText2, false)
      dmp.diff_charsToLines_(diffs, lineArray)
      return diffs