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 に答える