2013-11-19 3 views
0

У меня есть dict, мне нужно проверить все значения через мою функцию (эта функция не может быть изменена). код:Как укоротить код?

if func(arg, dict['a']) and func(arg, dict['b']) and func(arg, dict['c']) and func(arg, dict['d']): 
    pass 

Как укоротить, если заявление?

Спасибо.

ответ

9

Использование all:

if all(func(arg, my_dict[k]) for k in my_dict): 
    ... 

Не используйте dict в качестве имени переменной.

+0

'для c в dict' было бы большим улучшением здесь, поскольку OP специально отмечает, что он хочет проверить все значения в dict. (Хотя решение thefourtheye еще лучше, по крайней мере, под Python 3). –

+0

@ LennartRegebro Хорошая точка, пропустила эту линию. –

+0

@ LennartRegebro - текущий код OP не проверяет все значения, но будет замыкаться на первое значение, которое является False. – PaulMcG

5

Вы можете использовать функцию all как этот

if all(func(arg, value) for value in myDict.values()): 
    ... 

Примечание: Никогда не используйте встроенные имена типов в качестве имен переменных. В вашем случае dict является встроенным типом и именем функции. Вот почему у меня есть myDict

Sample Run

def func(arg, value): 
    return value 

myDict = {}.fromkeys(list("abcd"), True) 
if all(func("", value) for value in myDict.values()): 
    print "All TRUE" 

Выход

All TRUE 
+0

Почему искаженный код с 'no any'? 'all' также будет замыкаться на первое значение False. – PaulMcG

+0

@PaulMcGuire Ой. Да. Я удаляю это – thefourtheye

1

Для полноты функциональный подход. (Может быть, лучше использовать протокол IMAP вместо карты для python2)

from functools import partial 
if all(map(partial(func, arg), my_dict.values()): 
    ... 
1

Вашего текущий кода и большинство решений с использованием all или any перестанут оценивать записи в Словаре, как только будет найдено первое Ложное значение (эта функция называемый «короткое замыкание»). Если вы должны вызов func для каждого значения в Словаре, и если func возвращает истину или ложь (то есть, вы не полагаясь на BOOL интерпретации Пайтона типов, не BOOL), то вы можете использовать sum:

if sum(func(arg, my_dict[k]) for k in my_dict) == len(my_dict): 

Это делает использование Python эквивалентности True с 1 и False со значениями 0.

Если func возвращается без BOOL, затем обернуть вызовы func с bool:

if sum(bool(func(arg, my_dict[k])) for k in my_dict) == len(my_dict): 
+0

Или, будучи немного расточительным, вы можете просто добавить дополнительные '[]' inside 'all', чтобы сделать аргумент понятием списка. –

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