Сокращение оператора if in в Python - PullRequest
0 голосов
/ 13 июня 2018

У меня есть список строк, и я хочу использовать различные операторы, чтобы выбрать строку, удовлетворяющую моим условиям.

Пример кода ниже дает ответ, который я ищу:

strings = ['abc','bcd','cde','dea', 'eab']        
for string in strings:
    if 'a' in string and not 'b' in string and ('ea' not in string or 'd' in string):    
    print(string)
>> dea

Однако этот код требует от меня многократной записи «в строке», что выглядит грязно и требует времени при ссылке на ряд условий.

Я хочу знать, есть ли способсжать код, чтобы показать, что все операторы ищут в строке-

Я мог бы представить, что синтаксис выглядит примерно так:

strings = ['abc','bcd','cde','dea', 'eab']        
for string in strings:
    if ('a' and not 'b' and ('ea' not or 'd')) in string:    
        print(string)

, но когда я пытаюсь это сделать, я получаю SyntaxError.

Есть ли питонный способ сжать код?

Ответы [ 5 ]

0 голосов
/ 13 июня 2018

Вы можете использовать регулярные выражения, но они не так удобочитаемы:

import re

reg=re.compile(r"(?=.*a.*)(?!.*b.*)(?:(?!.*ea.*)|(?=.*d.*))\w+")

for string in strings:
    mo=reg.fullmatch(string)
    if mo:
        print(mo.group())
0 голосов
/ 13 июня 2018

Вы можете использовать функции, чтобы сделать оператор if более легким для чтения.Пока вы держите определения функций рядом с оператором if, читаемость должна быть в порядке.

strings = ['abc','bcd','cde','dea', 'eab']

def ye(c): return c in string
def no(c): return c not in string

for string in strings:
    if ye('a') and no('b') and (no('ea') or ye('d')):    
        print(string)
0 голосов
/ 13 июня 2018
strings = ['abc','bcd','cde','dea', 'eab']        
for string in strings:
    if 'a' in string and 'b' not in string:
        if 'd' not  in string or 'ea' in string:    
            print(string)
0 голосов
/ 13 июня 2018

Вы можете использовать eval () для оценки выражения, подобного этому:

for string in strings:
    if eval("'a' {0} and not 'b' {0} and ('ea' not {0} or 'd' {0})".format("in string")):
        print(string)
0 голосов
/ 13 июня 2018

Самый питонский подход - сделать ваш код максимально читабельным и выразительным.В вашем случае я бы использовал два if выражения:

for string in strings:
    if 'a' in string and 'b' not in string:
        if 'ea' not in string or 'd' in string:
             print(string)

dea
...