python,检测元素已被删除/添加/更改列表中的位置

时间:2012-04-29 11:50:30

标签: python list

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

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

在mod_list'ETIME'中被删除并且'flat',deb'被添加 - 所以这样的结果将是'ETIME'在索引2处移除并且'flat',deb'在索引8处添加& 9.

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

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

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

1 个答案:

答案 0 :(得分: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'])