Понимание списка:
[[i,j,k] for i in range(x+1) for j in range(y+1) for k in range(z+1) if (i+j+k) != n]
Более читабельно, если вы «развернете» его:
[
[i,j,k]
for i in range(x+1)
for j in range(y+1)
for k in range(z+1)
if (i+j+k) != n
]
Это эквивалентно обычному l oop:
ret = []
for i in range(x+1): # 0, 1, ..., x
for j in range(y+1): # 0, 1, ..., y
for k in range(z+1): # 0, 1, ..., z
if i+j+k != n:
ret.append([i,j,k])
По сути, вы храните каждый триплет в кубе [0, x] * [0, y] * [0, z]
, сумма которого не равна n
.
Функция range
создает неизменяемую последовательность. range(stop)
- это последовательность 0, 1, ..., stop-1
. Следовательно, range(x+1)
- это последовательность 0, 1, ..., x
. (Существуют другие параметры, см. Ссылку.)
С x, y, z, n = (1, 1, 1, 2)
у вас есть:
ret = []
for i in (0, 1): # 0, 1
for j in (0, 1): # 0, 1
for k in (0, 1): # 0, 1
if i+j+k != 2:
ret.append([i,j,k])
Триплеты: [0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]
проверены, а [0, 1, 1], [1, 0, 1], [1, 1, 0]
удалены, оставив [0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 1]
.