减少'如果在' Python中的语句

时间:2018-06-13 11:44:12

标签: python if-statement boolean

我有一个字符串列表,并希望使用各种不同的运算符来挑选满足我条件的字符串。

下面的示例代码为我提供了我正在寻找的答案:

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

但是,这段代码要求我在字符串中写出'多次,看起来很乱,并且在引用许多条件时需要时间。

我想知道是否有一种方法可以压缩代码以显示所有操作符都在搜索-in string -

我认为语法看起来像:

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。

是否有一种压缩代码的pythonic方法?

5 个答案:

答案 0 :(得分:2)

最Pythonic方法是让您的代码尽可能具有可读性和表现力。在您的情况下,我会使用两个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

答案 1 :(得分:1)

您可以使用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)

答案 2 :(得分:1)

您可以使用函数使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)

答案 3 :(得分:0)

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)

答案 4 :(得分:0)

您可以使用正则表达式,但它不太可读:

import re

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

for string in strings:
    mo=reg.fullmatch(string)
    if mo:
        print(mo.group())