使用Python打印列表之间的差异

2024-05-29 08:29:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个清单如下。我知道我可以使用set(list1)-set(list2)或反之亦然来打印与其他相应列表不同的列表。但是,我不想打印出完整的列表,我只想修改列表的那部分。你知道吗

例如,列表1:

[['Code', 'sID', 'dID', 'cID', 'ssID'], ['ABCD-00', 'ABCD-00-UNK', '358', '1234', '9999'], ['ABCD-01', 'ABCD-00-UNK', 160, '993', '587']]

清单2:

[['Code', 'sID', 'dID', 'cID', 'ssID', 'AddedColumn'], ['ABCD-00', 'ABCD-00-UNK', '358', '1234', '9999', 'AddedValue1'], ['ABCD-01', 'ABCD-00-UNK', 160, '993', 'ChangedValue', 'AddedValue2']]

如果我设置了差异,它会打印出整个列表。当'Code'、'sID'相同时,我希望输出只显示不同/添加/删除的列。你知道吗

编辑:

每个列表列表的第一个列表是标题。所以我想在“Code”、“sID”列中的值匹配时比较这些列表。你知道吗

期望输出:

Added - ['AddedColumn', 'AddedValue1', 'AddedValue2']
Deleted - []
Changed - ['Code', 'ABCD-01', 'ssID', 'ChangeValue']

像这样或更简单的东西也可以。你知道吗


Tags: 列表codeabcdcidsetdidsidlist2
2条回答

使用^{}计算列表是如何更改的:

from difflib import SequenceMatcher

matcher = SequenceMatcher()
for a, b in zip(list1, list2):
    matcher.set_seqs(a, b)
    for tag, i1, i2, j1, j2 in matcher.get_opcodes():
        if tag == 'equal': continue
        print('{:>7s} {} {}'.format(tag, a[i1:i2], b[j1:j2]))

此简单设置仅列出已添加、删除或替换的内容:

>>> from difflib import SequenceMatcher
>>> list1 = [['Code', 'sID', 'dID', 'cID', 'sID'], ['ABCD-00', 'ABCD-00-UNK', '358', '1234', '9999'], ['ABCD-01', 'ABCD-00-UNK', 160, '993', '587']]
>>> list2 = [['Code', 'sID', 'dID', 'cID', 'sID', 'AddedColumn'], ['ABCD-00', 'ABCD-00-UNK', '358', '1234', '9999', 'AddedValue1'], ['ABCD-01', 'ABCD-00-UNK', 160, '993', 'ChangedValue', 'AddedValue2']]
>>> matcher = SequenceMatcher()
>>> for a, b in zip(list1, list2):
...     matcher.set_seqs(a, b)
...     for tag, i1, i2, j1, j2 in matcher.get_opcodes():
...         if tag == 'equal': continue
...         print('{:>7s} {} {}'.format(tag, a[i1:i2], b[j1:j2]))
... 
 insert [] ['AddedColumn']
 insert [] ['AddedValue1']
replace ['587'] ['ChangedValue', 'AddedValue2']

但是matcher还提供了没有改变的内容;为了简化演示,我忽略了equal标记。它显示了如何添加两个元素,以及如何用另两个元素替换一个元素。你知道吗

set(a) - set(b)返回列表a中的元素,而不是列表b中的元素。若要查看添加到列表中的元素,请使用set(newList) - set(oldList);若要查看从列表中删除的元素,请使用set(oldList) - set(newList)。你知道吗

如果在python3中的列表上应用set(我不知道python2),则无法应用,您将得到以下错误:TypeError: unhashable type: 'list'。因此,您必须将其应用于每个相应的子列表。你知道吗

相关问题 更多 >

    热门问题