我有两个列表,如下所示.我知道我可以使用set(list1)-set(list2)或反之亦然来打印与其他对应列表不同的列表.但是,我不希望打印出完整的列表,我只想要修改列表的那一部分.
例如,list1:
[['Code', 'sID', 'dID', 'cID', 'ssID'], ['ABCD-00', 'ABCD-00-UNK', '358', '1234', '9999'], ['ABCD-01', 'ABCD-00-UNK', 160, '993', '587']]
Run Code Online (Sandbox Code Playgroud)
列表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']]
Run Code Online (Sandbox Code Playgroud)
如果我设置差异,它会打印出整个列表.我希望输出只显示"Code","sID"相同时不同/添加/删除的列.
编辑:
每个列表列表的第一个列表是标题.所以我想比较"Code","sID"列中的值匹配时的列表.
期望的输出:
Added - ['AddedColumn', 'AddedValue1', 'AddedValue2']
Deleted - []
Changed - ['Code', 'ABCD-01', 'ssID', 'ChangeValue']
Run Code Online (Sandbox Code Playgroud)
像这样或类似的东西也很好.
用于计算difflib.SequenceMatcher()列表的更改方式:
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]))
Run Code Online (Sandbox Code Playgroud)
这个简单的设置只列出添加,删除或替换的内容:
>>> 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']
Run Code Online (Sandbox Code Playgroud)
但是匹配器也会给你没有改变的东西; 我忽略了equal标签来简化演示.它显示了如何添加两个元素,并且一个元素被另外两个元素替换.
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |