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

python中,检测元素已在列表中删除/添加/更改位置,python,list,Python,List,我有一张物品清单。。原始列表和修改后的列表-我想知道的是哪些元素已从修改后的列表中删除/添加,以及w.r.t在原始列表中的位置。列表中没有重复项,也没有排序,因为列表中项目的顺序很重要。举个例子 Org = ['AMEND', 'ASTRT', 'ETIME', 'OBJ', 'ast', 'bias', 'chip', 'cold'] mod = ['AMEND', 'ASTRT', 'OBJ', 'ast', 'bias', 'chip', 'cold', 'flat', '

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

Org = ['AMEND', 'ASTRT', 'ETIME', 'OBJ', 'ast', 'bias', 'chip', 'cold']
mod = ['AMEND', 'ASTRT',         'OBJ', 'ast', 'bias', 'chip', 'cold', 'flat', 'deb']
在mod_列表中,删除了'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']
有什么办法解决这个问题吗

您可以使用来执行此类操作:

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

那重复的呢,你需要处理吗?而且,在第一个例子中,
mod
没有意义<代码>'asrt','OBJ',将抛出错误。你是说
'asrt',OBJ',
还是
'asrt',None',OBJ',
?@Lattyware刚刚纠正了这个错误-在这个位置没有任何元素。谢谢,我想我可以在此基础上继续。@user739807-很酷,添加了一块来筛选移动/删除/添加的项目。请考虑接受/投票,如果这对你有帮助的话,干杯!