2012-04-29 2 views
4

У меня есть список элементов. Оригинальный список и измененный список - то, что я хочу знать, - какие элементы были удалены/добавлены из измененного список и какую позицию по отношению к исходному списку. Списки не имеют дубликатов и не сортируются, потому что упорядочение элементов в списке имеет значение. Возьмем примерpython, обнаруженные элементы были удалены/добавлены/изменены позиции в списке

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

в mod_list «ETIME», был удален, а «были добавлены - таким образом, результатом этого будет„«плоский», Deb ETIME“удаляется с индексом 2 и„плоский“, Deb» добавлено по индексу 8 & 9.

Другая проблема заключается в обнаружении того, изменились ли позиции. В приведенном ниже примере «OBJ» и «ASTRT» изменили позиции.

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

Любые идеи о том, как это решить!

+2

Как насчет дубликатов, вам нужно справиться с этим? –

+0

Кроме того, '' mod'' в первом примере не имеет смысла. ''ASTRT', 'OBJ',' выдает ошибку. Вы имели в виду '' ASTRT ',' OBJ ', 'или'' ASTRT ', None,' OBJ ', '? –

+0

@Lattyware просто исправил эту ошибку - в этой позиции нет элемента. – user739807

ответ

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

Спасибо, я думаю, я смогу на этом поработать. – user739807

+1

@ user739807 - Прохладный, добавил кусок, чтобы отсеивать перемещенные/удаленные/добавленные предметы. Пожалуйста, подумайте о принятии/повышении, если это было полезно для вас, ура! – fraxel

Смежные вопросы