python - 有效地 merge python中的两个大字符串

标签 python python-3.x string git python-2.7

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

由于担心这个被标记为重复,我将解释为什么其他问题对我不起作用。

  • 使用 DIFFLIB for Python 的任何答案都无助于我的需求。 (我在下面描述更多)。它完全太慢了 - 除非有人给我一个很好的优化提示(unified_diff 模块),否则我将无法使用它。

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

  • 我不介意被标记为重复,只要它是一个真正能解决我的问题的问题 - 我已经搜集了一些网站,但还没有找到适合我的解决方案。

我想在 Python 中 merge 两个大字符串。每个字符串大约 1.5KB。假设有两个字符串,str1 和 str2,我只想返回 merged 字符串,它只是 str1 和 str2 的添加信息。我不想删除任何内容。

在大多数情况下,这些字符串相对相同。大多数时候,它将是 90% 相同的。不同的是,第二个字符串中可能会添加新的信息,我想将这些信息捕获到原始字符串中。

因此。

str1 = "This is a very
        Long string and
        This is how it looks."

str2 = "This is a very
        This is my Example
        This is how it looks."

result = "This is a very
          Long string and
          This is my Example 
          This is how it looks." #Third line was added to str1

我解决这个问题的第一种方法是使用 git diff。我在 Windows 上,我要做的是使用我将字符串输出到的临时文件执行 git diff cmd,然后立即删除这些文件。我制作的 cmd 函数会将输出(统一差异)作为字符串返回。然后我会在字符串上发布过程以删除 diff 总是添加的 header 。通过将输出指示符更改为空格,我能够删除每行上的“+”和“-”(为简单起见,我在代码中使用了所有选项。

#The f1and f2 text files are created here
#cmd is a function created by me, and it uses the os module to execute the command

output = cmd("git diff -U999999 -b --no-index f1.txt f2.txt")

#f1 and f2 text files are deleted here

我试过 DiffLib,但速度太慢了。做一个 diff 文件输出大约需要 8-10 分钟。我使用了 unified_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

然后您需要从输出列表中删除重复项(不使用集合,因为集合会打乱顺序)。

from collections import OrderedDict

output = list(dict.fromkeys(output))

for o in output:
    print(o)

>> A
>> B
>> E
>> C
>> F
>> D

我能想到的一些注意事项:

  1. 如果 len(list_1) != len(list_2),您将需要考虑到这一点。

  2. 我不清楚“merge ”在这种情况下的含义。例如,如果:

    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"]
    

我不清楚生成的 merge 应该是什么样子。

关于python - 有效地 merge python中的两个大字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57959855/

相关文章:

python - 无法使用 asyncio.ensure_future() 获取堆栈跟踪

python - 为什么我不能在 Django 中导入用户模型?

python - Pillow - 如何使用阈值对图像进行二值化?

python - 如何根据行获取数据框中行的最佳最近值?

c# - string.GetHashCode() 在调试和发布中返回不同的值,如何避免这种情况?

python - Homebrew 没有这样的桶

python - Python 中的 "for ... in"循环会增加空间复杂度吗?

python - Scapy: undefined variable 'Dot11Beacon' 和 'Dot11Elt'

string - 比较二进制字符串(不包括字母数字)

python - 根据单独的字典有条件地创建字典