2015-02-07 36 views
-2

我有两个列表如下所示。我知道我可以使用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

这样的事情或任何简单的是罚款也。

+0

_'Code','sID'是什么意思?什么是期望的输出? – GLHF 2015-02-07 01:03:47

回答

5

使用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])) 

这个简单的设置只被添加了什么东西列表,删除或替换:

>>> 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'] 

但匹配也给你什么都没有改变;我忽略了equal标签来简化演示。它显示了如何添加两个元素,并且一个元素被两个其他元素替换。

+1

谢谢。这真的有帮助。但是如果你不介意的话,请你简要解释一下这个部分是什么意思。{:> 7s} {} {} – abn 2015-02-07 01:17:19

+1

@amy这是['str.format()'方法](https://docs.python.org/3/library/stdtypes.html#str.format)用来填充值的格式字符串。 '> 7s'创建一个7个字符的列,并在最后一个字符串中右对齐。请参阅[*格式字符串语法*](https://docs.python.org/3/library/string.html#formatstrings)。 – 2015-02-07 01:23:48

+0

谢谢:) @Martijn Pieters – abn 2015-02-07 01:25:57

0

set(a) - set(b)返回列表a中的元素,但不包含列表b。要查看添加到列表中的元素,请使用set(newList) - set(oldList),查看从列表中删除的元素,使用set(oldList) - set(newList)

如果你在Python 3的列表中应用set(我不知道python 2),你将无法申请,你会收到以下错误:TypeError: unhashable type: 'list'。所以你将不得不将这个应用到每个相应的子列表。

+0

我把它们转换成了集合,我在这里没有提到。 – abn 2015-02-07 01:13:00