2014-09-26 2 views
1

Я Ниже приведен списокПоиска несоответствующего элемента для одного индекса в списке питона

l1 = ['a','b','c','a'] 
l2 = ['a','d','c','c'] 

Я хочу, чтобы выяснить элементы l2, которые не соответствуют элементам l1 в том же индексе. например: выход для вышеуказанного списка будет ['d', 'c']

как l2 должен иметь 'b' в 2-м положении.

Я могу сделать это путем повторения списка и поиска несоответствия.

l3 = [] 
for i in range(len(l1)): 
    if l1[i] != l2[i]: l3.append(l2[i]) 
print l3 

Есть ли лучший способ для этого. Спасибо.

ответ

3
missing = [b for a,b in itertools.izip_longest(l1,l2,fillvalue=object()) if a != b] 

немного больше вещий ... но в основном то же самое

+0

У меня был такой же список размеров, но да, это хорошо для будущего. – mribot

+1

Я думаю, что использование 'izip_longest' здесь вводит в заблуждение, потому что оно решает только половину проблемы (что OP не имеет). Что, если 'l1' длиннее' l2', но его дополнительные значения - все 'None'? В некоторых приложениях это может быть правильное поведение. В других случаях вы можете решить это, используя 'fillvalue = object()'. Но просто предлагая 'izip_longest' как лучше, чем' zip', даже не упоминая, похоже, что это приведет к тому, что люди будут беспокоиться. – abarnert

+0

Да, я согласен @abarnert ... спасибо, что упомянул об этом ... :) любое значение fillvalue может существовать в списке сравнения, и это, безусловно, является недостатком ... но для правильного решения этого вопроса потребуется больше строк. .. поэтому я упростил это к этому, даже если есть, конечно, крайние случаи, которые сломают его. –

3

список Python понимания, без необходимости импортировать любые модули, как itertools.

l3 = [b for a,b in zip(l1,l2) if b != a] 

Всякий раз, когда вы оказываетесь желая сделать цикл, в котором на каждой итерации может быть добавление к чему-то, что началось как пустой список, думаю, используя список понимание.

+3

за исключением того, что он не вернет правильные результаты, если они не того же размера ... но да +1 ... Я почти написал этот ответ, но решил использовать itertools.izip_longest, потому что знал, что кто-то придет и оставит комментарий просто вроде этого: P –

+0

Я одобрил ваш комментарий, но потом я просто протестировал случай, когда они не того же размера (попробовал его односторонний в обоих направлениях), и он, похоже, работал (используя Python 2.7.7). Или, я бы сказал, он не добавил конечные элементы из более длинного списка. Возможно, это не правильный/желаемый результат. На самом деле, я снова собираюсь поговорить о себе и сказать, что ваш, вероятно, лучший ответ, поскольку он будет придерживаться этих отстающих вещей из более длинного списка.: p – akgill

+0

Да, я согласен, что не ясно, что ОП желает в случае, если списки не имеют одинакового размера ... ответ может быть правильным ... Я просто обычно ошибаюсь на стороне осторожности и даю больше информации, а не теряю Информация –

-1

Если у вас есть те же списки размера вы можете использовать enumerate:

l1 = ['a','b','c','a'] 
l2 = ['a','d','c','c'] 
print [ele for ind,ele in enumerate(l2) if ele != l1[ind]] 
['d', 'c'] 
Смежные вопросы