2013-08-08 2 views
1

Я пытаюсь определить метод проверки, является ли каждый элемент списка фактором этого параметра.Попытка проверить условие для каждого элемента в списке целых чисел

Вот что у меня есть:

def factorall(x): 
if all(x % num for num in nums) == 0: 
    return True 
else: 
    return False 

(В этом случае Nums список целых чисел от 1 до 10)

Однако это возвращает верно для любого числа. Я предполагаю, что это происходит потому, что он проверяет только 1 и возвращает True, но не должен() проверять каждый элемент списка перед возвратом True?

Я немного незнакомый со всеми(), поэтому я, вероятно, воспользовался им неправильно. Может ли кто-нибудь указать мне в правильном направлении?

Спасибо!

+2

Как примечание стороны, нет никаких оснований, чтобы сделать 'если Foo: возвращение True' 'else: return False', когда' foo' уже является логическим. Вы просто делаете свой код длиннее (и труднее читать и поддерживать). – abarnert

ответ

2

Вы должны сделать сравнение внутри функции all, или просто удалить его и использовать отрицание результата x % num:

def factorall(x): 
    return all(not x % num for num in nums) 

Ответный оператор работает так же, как:

return all(x % num == 0 for num in nums) 

Я согласен, что второй кажется яснее.

+0

Я немного смущен тем, почему мне нужно включить не то, хотя. Не могли бы вы объяснить? Извините, если это глупый вопрос. – foobar1209

+0

@ RAF1940. Извините, что запутался. Если 'num' является фактором' x', 'x% num' будет' 0'. Поскольку мы используем 'all()' функцию, мы делаем 'not', чтобы сделать результат' True' для коэффициента И если все числа являются коэффициентом, тогда все значение будет 'True' в' all() '. –

+1

@ RAF1940. Это похоже на использование' x% num == 0'. Оба они будут 'True', если 'num' является фактором' x'. –

2
def factorall(x): 
    if all(x % num == 0 for num in nums): 
     return True 
    else: 
     return False 
+0

пропустил, что не было 0 внутри всего :( –

7

вы должны использовать not any вместо всех

def factorall(x): 
    return not any(x%num for num in nums) #if any of these is a value other than 0 

или если вы хотите, как вы в настоящее время его

def factorall(x): 
    return all(x%num==0 for num in nums) 
+2

+1, good catch :) –

+0

Мне интересно, может ли какой-либо вариант использования «все» быть реализован с 'any', и если да, не всегда ли было бы лучше? – RussW

+0

законы деморганов говорят, что любое выражение может быть инвертировано ... но я не думаю, что он всегда лучше, он зависит от того, что вы пытаетесь выразить http://en.wikipedia.org/wiki/De_Morgan's_laws –

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