Я хочу минимизировать следующий небольшой блок кода:
if jwinkler.get_jaro_distance(text,l1) >= 0.90 or jwinkler.get_jaro_distance(text, l2) >= 0.90 or jwinkler.get_jaro_distance(text,l3) >= 0.90:
print('passed')
На самом деле, как вы увидите, функция всегда одинакова, меняется только второй параметр (l1, l2, l3). Мне пришло в голову сделать это:
if True in [jwinkler.get_jaro_distance(text,x) >= 0.90 for x in [l1,l2,l3]]:
print('passed')
, который работает , но это не кажется Pythonic . Есть ли другой способ сделать это?
Недели назад я pasГі что-то похожее на то, что никто не сумел давать мне ответ mГЎs, что та, которую ты сами даешь, asГ - что я предполагаю, что habrГЎ, что соответствовать, конечно гораздо лучше, что первая opciГіn.
Форма pythГіnica serГ - в следующую:
if any(jwinkler.get_jaro_distance(text,x) >= 0.90 for x in [l1,l2,l3]):
print('passed')
ExplicaciГіn
any()
ждет iterable как parГЎmetro. В этом случае его перемещают одна expresiГіn порождающая (он наблюдает, что я не поместил ее между квадратными скобками, так как, того, чтобы сделать раньше одной serГ - comprensiГіn из списков ) any()
, он извлекает элементы iterable и как только он находит один True
, он возвращает True
. Преимуществ на тебе soluciГіn
True
готовый. Таким образом он ведет себя как or
в одной expresiГіn booleana. Этого знает как короткое замыкание lГіgico . Следовательно смоги быть mГЎs работоспособно tambiГ©n во времени ejecuciГіn (если только все элементы не будут False
, в случае которых нужно оценивать все их так или иначе). PD: TambiГ©n у тебя есть all()
, который сходный с any()
, но sГіlo возврати True
, если всех элементов True
. В этом случае короткое замыкание lГіgico случается как только находится один False
, так как в этом случае уже он может возвращать False
, не оценивая оставшейся части.