2015-10-02 3 views
3

, если у меня есть два списка:Что правильный синтаксис список понимание для этого

e = [3,1,5,8], w = [1,2,4]

, и я хочу, чтобы пойти и проверить, какой элемент е равномерно делится на каждый элемент ж, как я делаю это в понимании списка? поэтому, используя мои два списка, 8 должен быть возвращен с 8 % each i in w даст нуль.

в терминах для цикла я имею в виду что-то вроде:

for i in e: 
    for j in w: 
     if i % j == 0: 
      print i 

но даже это неправильно!

+3

'[i для i в e, если не любой (i% j для j в w)]' Я думаю ... –

ответ

5
[i for i in e if all(i % j == 0 for j in w)] 
0

Если число делится на каждый элемент в списке чисел, то он также должен быть равномерно делится с произведением всех чисел в списке.

e = [3,1,5,8, 16, 32] 
w = [1,2,4] 


product = reduce(lambda a,b: a*b, w) 

answer = [i for i in e if i % product == 0] 

# print answer -> [8, 16, 32] 
+0

Это неверно. Представьте, 4 были в 'e'; ваш код исключит его. Вы хотите 'lcm = уменьшить (lambda a, b: a * b/fractions.gcd (a, b), w)' вместо этого. – jfs

+0

Как вы правы, это происходит, когда наибольшее число является числом всех остальных номеров в списке. –

+0

нет, это происходит для любой последовательности чисел, которая не является относительно простой, т. Е. Если 'gcd (a, b)! = 1' – jfs

1

Чтобы проверить, какой элемент 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] 

т.е. все, что вам нужно, чтобы удалить двоеточие и добавить скобки - заказ точно такая же.

Если вам нужно выяснить правильный синтаксис для понимания списка, то это означает, что вы, вероятно, должны оставить код в виде явных вложенных циклов.

+0

будет всегда давать тот же результат, что и ваш ответ ' e = [1,3 , 5,8] w = [1,2,4] L = [i для i в e для j в w, если i% j == 0] r = [] q = max (set (L) , key = L.count) для i в w: , если q% i == 0: r.append (q) if len (r) == len (w): print q' –

+0

@FakeBrain: нет, код во второй части ответа просто показывает синтаксис - он не предназначен для получения того же результата как первая часть с lcm. Используйте код lcm, чтобы проверить делимость. Понимание списка эквивалентно коду с явным вложенным циклом из вашего вопроса, который не проверяет правильность делимости. – jfs

Смежные вопросы