从unified_diff输出恢复列表

2 投票
1 回答
815 浏览
提问于 2025-04-16 20:04

我需要生成两个字符串数组之间的差异:

a=['1','2']
b=['1','2','3']

为此,我正在使用Python中的difflib库(2.6版本):

c=difflib.unified_diff(a,b)

我保存了内容

d=list(c)

内容大概是这样的:

['---  \n', '+++  \n', '@@ -1,2 +1,3 @@\n', ' 1', ' 2', '+3']

我该如何利用unified_diff函数的输出,从第一个数组构建第二个数组呢?

我想要的效果是这样的:

>>> merge(a,d)
>>> ['1','2','3']

附注:这个数组可以有重复的条目,而且每个条目出现的顺序对我的应用程序很重要。此外,从一次迭代到另一迭代,数组中间或开头可能会有变化,也可能在末尾添加新的条目。

1 个回答

2

我不确定我的例子是不是好的写法,但你可以试试这样的方式:

from collections import Counter

a=['1','2']
b=['1','2','3']

a.extend(b)

[k for k,v in Counter(a).items() if v == 1]

或者,如果你的列表里只能有唯一的项目:

list(set(a) ^ set(b))

或者:

missed_in_a = [x for x in a if x not in b]
missed_in_b = [x for x in b if x not in a]

或者:

a=['1','2']
b=['1','2','3']

c = [x for x in a]
c.extend(b)

diff = [x for x in c if a.count(x)+b.count(x) == 1]

最后一个(希望我理解你的意思,抱歉如果理解错了):

a = ['1','2','3','4']
b = ['2','2','3','6','5']

from difflib import unified_diff

def merge(a,b):
    output = []
    for line in list(unified_diff(a,b))[3:]:
        if '+' in line:
            output.append(line.strip('+'))
        elif not '-' in line:
            output.append(line.strip())
    return output

print merge(a,b)        

撰写回答