Ваше понимание списка выполняет вложенные циклы, а не параллельные циклы. Он проходит через перекрестное произведение двух ломтиков. Вы можете увидеть это, если удалите if
и вернете сами значения x
и y
.
>>> [(x, y) for x in lst[:-1] for y in lst[1:]]
[(1, 2), (1, 3), (1, 4), (1, 4), (2, 2), (2, 3), (2, 4), (2, 4), (3, 2), (3, 3), (3, 4), (3, 4), (4, 2), (4, 3), (4, 4), (4, 4)]
Результат будет содержать True
, если парные элементы являются последовательными; когда они не идут подряд, это ничего не добавляет к результату. Есть 4 пары, которые идут подряд, так что вы получите результат.
Если вы хотите проверить только соседние элементы, используйте zip()
в понимании:
>>> [True for x, y in zip(lst[:-1], lst[1:]) if x + 1 == y]
[True, True, True]
Если вы хотите вернуть в списке и True
, и False
, вы не должны использовать if
, вы должны вернуть результат теста:
>>> [(x + 1 == y) for x, y in zip(lst[:-1], lst[1:])]
[True, True, True, False]