Я бы сделал что-то вроде этого:
[(i, colour.index(c))
for i, colour in enumerate(colours)
if c in colour]
Это вернет список кортежей, где первый индекс - это позиция в первом списке, а второй - позиция во втором списке (примечание:c
- это цвет, который вы ищете, то есть "#660000"
).
Для примера в вопросе возвращается значение:
[(0, 0)]
Если вы простонужно найти первую позицию, в которой цвет найден ленивым образом, вы можете использовать это:
next(((i, colour.index(c))
for i, colour in enumerate(colours)
if c in colour),
None)
Это вернет кортеж для первого найденного элемента или None
, если элемент не найден (Вы также можете удалить приведенный выше аргумент None
, который вызовет исключение StopIteration
, если элемент не найден).
Редактировать: Как правильно указывает @RikPoggi, если число совпадений велико, этовнесет некоторые издержки, потому что colour
повторяется дважды, чтобы найти c
.Я предположил, что это разумно для небольшого числа совпадений и иметь ответ в одном выражении.Однако, чтобы избежать этого, вы также можете определить метод, используя ту же идею следующим образом:
def find(c):
for i, colour in enumerate(colours):
try:
j = colour.index(c)
except ValueError:
continue
yield i, j
matches = [match for match in find('#660000')]
Обратите внимание, что, поскольку find
является генератором, вы можете использовать его, как в примере выше с next
остановиться на первом матче и пропустить взгляд дальше.