Чтобы проверить, какой элемент e
равномерно делится на каждом элементе w
:
#!/usr/bin/env python
import fractions
import functools
e = [3,1,5,8]; w = [1,2,4]
lcm = functools.reduce(lambda a,b: a*b // fractions.gcd(a, b), w)
result = [i for i in e if i % lcm == 0]
# -> [8]
Это линейный алгоритм (если число ограниченно), в отличие от вложенного списка понимания, квадратичный алгоритм, например, если e
, w
должны были содержать миллион чисел каждый, тогда для линейного алгоритма потребовалось бы около миллиона операций, которые должны быть быстрыми даже на скромном устройстве, в то же время квадратичный алгоритм будет принимать операции ~ 1e12 (число с 12 нулями), которые может занять некоторое время.
В общем, если вы видите:
L = []
for i in e:
for j in w:
if i % j == 0:
L.append(i)
, то это эквивалентно:
L = [i for i in e for j in w if i % j == 0]
т.е. все, что вам нужно, чтобы удалить двоеточие и добавить скобки - заказ точно такая же.
Если вам нужно выяснить правильный синтаксис для понимания списка, то это означает, что вы, вероятно, должны оставить код в виде явных вложенных циклов.
'[i для i в e, если не любой (i% j для j в w)]' Я думаю ... –