2013-06-28 3 views
0
x = False 
divisors = [2,3,4,5,6,7,8,9,10] 
for i in range (10,10000,10): 
    if [x for x in divisors if i % x == 0]: 
     print(i) 
     break 

Могу ли я получить некоторые указания относительно того, почему эта программа печатает 10? Он должен печатать .. 2520Понимание списка Python (проект Euler 5)

Я потратил так много времени на эту проблему сейчас, я думаю, что я действительно не понимаю понимание списка, как он работает, что он возвращает.

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

мне нужно использовать отливку ли?

Действительно ли я в этом диапазоне (10 10000,10) дает список 10, 20, 30, 40, ..., 10000?

ответ

4

Попробуйте изменить его на следующее:

divisors = [2,3,4,5,6,7,8,9,10] 
for i in range (10,10000,10): 
    if all(i % x == 0 for x in divisors): 
     print(i) 
     break 

Список понимания в текущей версии всегда будет содержать в последние 3 значения в нем, поскольку все кратные 10 равномерно делится на 2, 5 и 10 . Непустой список оценивается как истинный в булевом контексте, поэтому вы введете блок if на первой итерации.

Встроенная функция all() принимает итерацию и возвращает True только в том случае, если каждый элемент является истинным (или оценивается как истинный в булевом контексте). Поэтому он идеально подходит для определения того, является ли i равномерно делимым на все значения в divisors.

+0

Большое спасибо, что, безусловно, сработало, печатает 2520 и все такое. Да, я не знал, как применить И логику к моей оценке, я думаю, мне нужно заполучить правильную последнюю книгу на Python. – DrOnline

3

Давайте разложим это. Начнем с того, что

x = False 

не делает ничего, кроме загромождения кода. Не используйте это. Далее:

for i in range (10,10000,10): 

Не глядя на проект, иметь в виду, что диапазон() дает все значения меньше, чем значение остановки, так что закончится в 9990. Если это то, что вы хотите, прекрасно - просто имейте это в виду.

Наконец:

if [x for x in divisors if i % x == 0]: 

Это читается как «создать список всех чисел в divisors, которые делят равномерно на I», затем «если список, который я только что создал не пусто, то ...» , Поэтому, когда i == 10, этот список оценивается как [2, 5, 10]. Это не пустой список, поэтому он оценивается как True и работает блок if.

+0

Спасибо за указатели. Есть миллион из них для программирования, и они все пустые мне в этот момент, поэтому каждый, кого я могу узнать, - огромная помощь. Цените это много. Эй, как я могу сделать цикл for без максимальной границы? Замените 10000 на некоторую функцию для максимального целочисленного значения. – DrOnline

+1

Вы можете использовать ['itertools.count()'] (http://docs.python.org/2/library/itertools.html#itertools.count) для этого , 'for i in count (10, 10)' даст вам цикл, начинающийся с '10', с шагом' 10', который будет выполняться бесконечно (или до тех пор, пока вы не разорвете, не вернете или не создадите исключение). –

+0

Бинго. Выглядит лучше в моих глазах, и, похоже, это не влияет на время конвергенции, так что это здорово. – DrOnline