Объясните, как работает строчка #7

from itertools import permutations

g = 'AB BC CD DA'.split()
t = '24 13 24 13'.split()
print('1 2 3 4')
for p in permutations('ABCD'):
    if all(str(p.index(b2) + 1) in t[p.index(b1)] for b1, b2 in g): # 7
        print(*p)
        break

Ответы (1 шт):

Автор решения: Evgenii Evstafev

Если правильно посчитал нумерацию строк :D

if all(str(p.index(b2)+1) in t[p.index(b1)] for b1, b2 in g):

По шагам:

  1. for b1, b2 in g: - перебираем элементы в итерируемом объекте g. Предполагается, что каждый элемент g состоит из двух значений, которые присваиваются переменным b1 и b2 на каждой итерации.
  2. p.index(b1) - находим индекс/позицию элемента b1 в списке p.
  3. t[p.index(b1)] - используем найденный индекс b1 для доступа к элементу в объекте t.
  4. p.index(b2) - находим индекс элемента b2 в списке p.
  5. p.index(b2) + 1 - к индексу b2 прибавляется 1.
  6. str(...) - преобразуем результат p.index(b2) + 1 число в строку.
  7. ... in ... - проверяем, содержится ли строка (полученная в шаге 6), как подстрока внутри значения, полученного из t на шаге 3. Эта проверка выполняется для каждой пары (b1, b2).
  8. all(...) - эта функция принимает результаты всех проверок (из шага 7) для каждой пары (b1, b2) из g. Она возвращает True только в том случае, если ВСЕ проверки вернули True. Если хотя бы одна проверка вернула False, all() вернет False.
  9. if ...: - после двоеточия выполнится только если функция all() вернула True.

Итого: Условие if истинно, если для КАЖДОЙ пары (b1, b2) в g, строковое представление (индекса b2 в p плюс 1) содержится в элементе t, который соответствует индексу b1 в p.

→ Ссылка