【发布时间】:2015-02-10 18:08:14
【问题描述】:
我有两个列表,如下所示。我知道我可以使用 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']]
列表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']]
如果我确实设置了差异,它会打印出整个列表。当“代码”、“sID”相同时,我希望输出仅显示不同/添加/删除的列。
每个列表列表的第一个列表是标题。所以我想在“代码”、“sID”列中的值匹配时比较列表。
期望的输出:
Added - ['AddedColumn', 'AddedValue1', 'AddedValue2']
Deleted - []
Changed - ['Code', 'ABCD-01', 'ssID', 'ChangeValue']
类似的东西或者更简单的东西也可以。
我试过的代码:
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]))
它在比较相应的列表时效果很好,即 list1 中的 sub-list1 与 list2 中的 sub-list1。但我希望它在整个列表中进行比较,因为如果缺少特定的子列表,它会打印出一切都不同。子列表是指,例如['Code', 'sID', 'dID', 'cID', 'ssID'] in list1 是 sub-list1。
【问题讨论】:
-
你真的不能做“set(...) - set(...)”的事情:列表是可变对象,不能被设置成员
-
您是否受困于列表和特定格式?好像不太好。
-
@jsbueno 我将它们更改为集合,我没有将其包含在问题中。
-
@user3467349 我不应该只使用列表,本质上是比较两个 CSV 文件,我以列表的形式拥有。
-
这让事情变得更糟:-) - 您的数据被视为按列排列并且严格依赖于顺序 - 您的程序如何知道“ABCD-00”是关于“代码”的,如果它是不是子序列中的第一个元素?