Вы не можете избежать итерации по спискам, но вы можете сделать это с пониманием и получить элегантное решение:
next((idx, x, y) for idx, (x, y) in enumerate(zip(list1, list2)) if x!=y)
Если вы хотите что-то менее одна линия Centric вы можете разделить его, как это
coupled_idx = enumerate(zip(list1, list2))
res = next(idx for idx, (x, y) in coupled_idx if x!=y)
EDIT:
как дополнение, если вам нужно проверить случай, когда два списка может быть укомплектовать равен, вы можете добавить второй параметр к следующей функции, сообщает, что возвращается, если индекс не найден. Наиболее распространенным вариантом является не возвращать None:
coupled_idx = enumerate(zip(list1, list2))
res = next((idx for idx, (x, y) in coupled_idx if x!=y), None)
Обратите внимание, что вам нужно заключить выражение генератора между круглыми скобками, потому что это не единственный аргумент функции в этом вызове.
Просто добавьте немного удовольствия, вы также можете спросить n-ю другую пару, связав выражения. Например, это дает вам все пары до пятого одного (заполнение None, если пара отсутствует)
coupled_idx = enumerate(zip(list1, list2))
coupler = (idx for idx, (x, y) in coupled_idx if x!=y)
res = [ next(coupler, None) for _ in range(5) ]
EDIT2:
Такое решение на самом деле создать копию как списка с помощью почтового индекса функция. Если вам нужно избежать этого, вы можете использовать функцию izip вместо модуля itertools.
И о забавной части, вы можете выбрать только certains решения через Ислицу функции fromt он же модуль
Итак - вы господствующий о ut 'enumerate (zip (a, b))' then? –
Мне очень интересно, что вы подразумеваете под «лаконичным питоническим решением». Какой speask против этого скучно: сортировать, уменьшать (дубликаты), сравнивать - подходить? или даже перечисление? – Najzero
@Najzero: что-то с lambdas или с помощью некоторых функций, о которых я не знаю, что позволит решить проблему в одной строке.Точнее, я хочу как можно меньше кода :) –