Подтвердить что ты не робот

Понятия в Python к выборке кортежей из списка

Я пытаюсь получить список трехэлементных кортежей из списка [-4, -2, 1, 2, 5, 0] с использованием понятий и проверить, выполняют ли они условие sum([] == 0). Следующий код работает. Однако нет сомнений в том, что должен быть более простой, более элегантный способ выражения этих понятий:

[
    (i, j, k) for i in [-4, -2, 1, 2, 5, 0]
              for j in [-4, -2, 1, 2, 5, 0]
              for k in [-4, -2, 1, 2, 5, 0] if sum([i, j, k]) == 0
]

Вывод:

[(-4, 2, 2), (-2, 1, 1), (-2, 2, 0), (-2, 0, 2), (1, -2, 1), 
 (1, 1, -2), (2, -4, 2), (2, -2, 0), (2, 2, -4), (2, 0, -2), 
 (0, -2, 2), (0, 2, -2), (0, 0, 0)]

Вопрос заключается в поиске выражения типа (i, j, k) for i, j, k in [-4, -2, 1, 2, 5, 0].

4b9b3361

Ответ 1

Вы можете использовать itertools.product, чтобы скрыть вложенные циклы в вашем понимании списка. Используйте параметр repeat, чтобы установить количество циклов над списком (т.е. Количество элементов в кортеже):

>>> import itertools
>>> lst = [-4, -2, 1, 2, 5, 0]
>>> [x for x in itertools.product(lst, repeat=3) if sum(x) == 0]
[(-4, 2, 2),
 (-2, 1, 1),
 (-2, 2, 0),
 (-2, 0, 2),
 (1, -2, 1),
 (1, 1, -2),
 (2, -4, 2),
 (2, -2, 0),
 (2, 2, -4),
 (2, 0, -2),
 (0, -2, 2),
 (0, 2, -2),
 (0, 0, 0)]