2016-05-24 2 views
2

Я пытаюсь проверить определенный список на очень конкретный набор правил. В этом конкретном примере у меня есть список кодов выхода, и я хочу проверить, не прошел ли тест. Тест терпит неудачу, если даже один из кодов возврата не равен 0.Как проверить «если условие» для каждого элемента в списке

Моя текущая реализация:

for exit_code in result_list: 
    if exit_code is not 0: 
     raise TestFailed 

Вопрос: можно ли втиснуть первые две строки в одну? Предпочтительно ли это делать?

+1

ИМХО используя 'any' не делает ваш код более читаемым. Я лично рекомендую не использовать неявное преобразование из 'int' в' bool', поскольку оно делает код менее читаемым. Я предпочитаю объяснение. Единственное преимущество 'any' может быть лучше, потому что цикл находится внутри библиотечной функции. Но это, вероятно, преждевременная оптимизация и/или не ваше узкое место в производительности. – Markus

ответ

4

Вы также можете использовать any или all вроде этого:

>>> any(exit_code !=0 for exit_code in result_list) 
True 
>>> all(exit_code==0 for exit_code in result_list) 
False 

с 1 истинно и 0 false в python.

any(result_list) будет пытаться найти 1 элемент, который не является 0 (True)

+1

Отмечено как правильный ответ за то, что он не только дал правильное решение, но и дал два похожих метода, с которыми я не знаком. Также объясняем, что возвращает каждая функция. –

+0

, используя 'all (result_list)' здесь неправильно. Вы ДОЛЖНЫ отрицать элементы перед переходом на 'all'. 'error_found = not all (не i для i в result_list)'. Отрицание списка перед переходом к 'all' не может быть опущено. – Markus

+0

@Markus, использующий 'all' здесь, является немного рискованным, поскольку он не пропускает все случаи. Например: '[0, 0, 1, 0, 0]' -> 'not all()' приведет к 'True', ваш код также приведет к' True', мы не сможем использовать 'all' здесь. Пожалуйста, снимите голос. – ritesht93

5

Вы можете использовать any:

if any(exit_code != 0 for exit_code in result_list): 
    raise TestFailed 

Следует отметить, что описанный выше метод предполагает, что вы также проверки значений, которые эквивалентны булева False (например, None или False!). Если вы уверены, что ваш result_list содержит только цифры, вы можете сократить его немного больше:

if any(result_list): 
    raise TestFailed 
+0

Я отметил ответ @ ritesht93 как правильный, но также поддержал этот ответ, так как он содержит очень хорошее объяснение того, как это реализовать. Мне очень понравилась вторая, более короткая реализация. Так аккуратно! –

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