我有两个列表如下所示。我知道我可以使用set(list1)--set(list2)或反之亦然打印与其他对应的列表不同的列表。但是,我不希望将完整列表打印出来,我只是希望修改列表中的那部分内容。使用Python的列表列表的差异
例如,列表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'列中的值匹配时的列表。
所需的输出:
3210这样的事情或任何简单的是罚款也。
我已经试过代码:
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]))
它运作良好,在比较对应列表,即子列表1中,在列表2子列表1列表1。但是我希望它能够在整个列表中进行比较,因为如果缺少特定的子列表,它会显示所有内容都不相同。通过子列表我的意思是,例如列表1中的['Code', 'sID', 'dID', 'cID', 'ssID']
是子列表1。
你真的不能做“set(...) - set(...)”的事情:列表是可变对象,不能被设置成员 – jsbueno 2015-02-10 18:20:06
你坚持使用列表和特定格式吗?这看起来不太好。 – user3467349 2015-02-10 18:20:22
@jsbueno我把它们改成了集合,我没有在这个问题中加入。 – abn 2015-02-10 18:20:57