Учитывая список элементов, я хочу создать функцию, которая проверяет, соответствует ли она определенным критериям, и возвращает true или false.
Вот пример критериев и ожидаемого результата:
#the to check against with criteria[1]
langList = ['spanish','english','russian','persian']
criteria = ['any'] #matches any language
result: match
#langList does not contain one or all
criteria = ['any-but-or',[english,chinese]]
result: no match
#langList does not contain all
criteria = ['any-but-and',[english,chinese]]
result: match
#langList contains one or all
criteria = ['any-with-or',[english,chinese]]
result: match
#langList contains all
criteria = ['any-with-and',[english,chinese]]
result: no match
#langList contains one or all and no others
criteria = ['only-with-or',[english,chinese]]
result: no match
#langList contains all and no others
criteria = ['only-with-and',[english,chinese]]
result: no match
Какой лучший способ сделать это?
Моя идея похожа на приведенную ниже, но я еще не освоил понимание списка, которое, я думаю, является ключевым здесь.
def check_criteria_match(criteria, languageList):
rule = criteria[0]
criteriaLanguages = criteria[1]
match = True
if rule != 'any':
continue
elif rule = 'any-but-or' #check languageList:
match = False; break
#[...]
return match
EDIT:
Основываясь на ответе Правина Голлакота , вот последняя функция, не правда ли, она хорошенькая:)
def check_rule(rule, o, p):
# o = original, p = pattern
if rule == 'any':
return True
elif rule == 'any-but-or':
return not bool(set(p)-set(o))
elif rule == 'any-but-and':
return len(set(p)-set(o)) != 0
elif rule == 'any-with-or':
return len(set(p)-set(o)) <= 1
elif rule == 'any-with-and':
return len(set(p)-set(o)) == 0
elif rule == 'only-with-or':
return len(set(o)-set(p)) <= 1
elif rule == 'only-with-and':
return len(set(o)-set(p)) == 0