我有一个项目列表..一个原始列表和一个修改过的列表 - 我想知道的是从修改后的列表中删除/添加了哪些元素以及原始列表中的位置.列表没有重复项,也没有排序,因为列表中项目的排序很重要.举个例子
Org = ['AMEND', 'ASTRT', 'ETIME', 'OBJ', 'ast', 'bias', 'chip', 'cold']
mod = ['AMEND', 'ASTRT', 'OBJ', 'ast', 'bias', 'chip', 'cold', 'flat', 'deb']
Run Code Online (Sandbox Code Playgroud)
在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']
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的任何想法!
您可以使用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']
Run Code Online (Sandbox Code Playgroud)
从这里,您可以遍历列表并检查项目是新的,移动还是丢失.例如:
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'])
Run Code Online (Sandbox Code Playgroud)