4

我有一个项目列表.. 一个原始列表和一个修改列表 - 我想知道哪些元素已从修改列表中删除/添加,以及原始列表的位置。列表没有重复项且未排序,因为列表中项目的顺序很重要。举个例子

Org = ['AMEND', 'ASTRT', 'ETIME', 'OBJ', 'ast', 'bias', 'chip', 'cold']
mod = ['AMEND', 'ASTRT',         'OBJ', 'ast', 'bias', 'chip', 'cold', 'flat', 'deb']

在 mod_list 'ETIME' 中,已删除并添加了 'flat', deb' - 因此结果将是在索引 2 处删除了 'ETIME' 并在索引 8 和 9 处添加了 'flat', deb'。

我的另一个问题是检测项目是否改变了位置。在下面的示例中,“OBJ”和“ASTRT”已经改变了位置。

Org = ['AMEND', 'ASTRT', 'ETIME', 'OBJ', 'ast', 'bias', 'chip', 'cold']
mod = ['AMEND', 'OBJ', 'ETIME', 'ASTRT', 'ast', 'bias', 'chip', 'cold']

关于如何解决这个问题的任何想法!

4

1 回答 1

9

你可以使用difflib来做这种事情:

>>> import difflib
>>> Org = ['AMEND', 'ASTRT', 'ETIME', 'OBJ', 'ast', 'bias', 'chip', 'cold']
>>> mod = ['AMEND', 'ASTRT', 'OBJ', 'ast', 'bias', 'chip', 'cold', 'flat', 'deb']
>>> list(difflib.ndiff(Org, mod))
['  AMEND', '  ASTRT', '- ETIME', '  OBJ', '  ast', '  bias', '  chip', '  cold', '+ flat', '+ deb']

从这里您可以遍历列表并检查项目是否是新的、移动的或丢失的。例如:

Org = ['a', 'b' ,'c', 'd', 'e', 'f', 'g', 'h', 'i']
mod = ['i', 'b', 'c', 'z', 'd', 'f', 'g', 'h', 'a']
differences = set(difflib.ndiff(Org, mod))

moved = set([item[2:] for item in differences if item[0]=='+' and '-' + item[1:] in differences])
removed = set([item[2:] for item in differences if item[0]=='-']) - moved
added = set([item[2:] for item in differences if item[0]=='+']) - moved

print 'moved items:', moved
print 'removed items:', removed
print 'added items:', added
#output:
moved items: set(['a', 'i'])
removed items: set(['e'])
added items: set(['z'])
于 2012-04-29T12:06:36.023 回答