2015-06-23 3 views
0

мне было интересно, если есть лучший способ выразить это, если заявление:Как упростить оператор if, проверяющий общие символы в строке?

if any(i in word for i in '@/#')==False: 

Я перебор списка строк и добавление в новый список всех строк, которые не имею вышеуказанные символов (Я также хочу сохранить старый список). Вышеприведенное заявление работает, но оно уродливо, и моя IDE говорит мне, что может быть лучший способ. Есть ли способ, чтобы я мог сортировать строки, которые я хочу, которые красивее или быстрее?

ответ

4
if not any(i in word for i in '@/#'): 

или

if all(i not in word for i in '@/#'): 

Там почти никогда не хорошая причина, чтобы сравнить логическое значение для True или False с ==.

+1

Я не думаю, что даже сказал бы «почти». – TigerhawkT3

+0

Правда, код «Pythonic» должен редко прибегать к сравнению с «True» или «False». Простое 'if' или' if not' делает работу отлично. – pawroman

+0

Полезно знать об избежании сравнения с «True» или «False». Спасибо – jot2102

3

Вы могли бы попробовать, как это:

characters = set('@/#') 

, а затем:

if characters.isdisjoint(word): 

или в качестве альтернативы (но немного медленнее, что может иметь смысл для очень длинных строк):

if not characters.intersection(word): 

(с лучшим именем вместо characters, относящимся к его понятию Конечно, конечно)

+2

Huh. Я полностью забыл о 'isdisjoint'. Учитывая, что '@/# '' три символа, я бы, вероятно, сделал это множество и, возможно, вычислил его один раз в верхней части цикла. – user2357112

+0

@ user2357112 Хорошая идея, спасибо! – BartoszKP

+2

Кроме того, стоит отметить, что 'isdisjoint' немедленно остановится, когда найдет совпадение, в то время как' intersection' будет всегда проходить через всю строку. – user2357112

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