How to make it shorter (Pythonic)?

前端 未结 6 825
半阙折子戏
半阙折子戏 2021-02-15 16:56

I have to check a lot of worlds if they are in string... code looks like:

if \"string_1\" in var_string or \"string_2\" in var_string or \"string_3\" in var_stri         


        
相关标签:
6条回答
  • 2021-02-15 17:21

    With regex that would be:

    import re
    words = ['string_1', 'string_2', ...]
    
    if re.search('|'.join([re.escape(w) for w in words]), var_string):
        blahblah
    
    0 讨论(0)
  • 2021-02-15 17:26

    This is one way:

    words = ['string_1', 'string_2', ...]
    
    if any(word in var_string for word in words):
        do_something()
    

    Reference: any()

    Update:

    For completeness, if you want to execute the function only if all words are contained in the string, you can use all() instead of any().

    Also note that this construct won't do any unnecessary computations as any will return if it encounters a true value and a generator expression is used to create the Boolean values. So you also have some kind of short-circuit evaluation that is normally used when evaluating Boolean expressions.

    0 讨论(0)
  • 2021-02-15 17:33

    one more way to achieve this check = lambda a: any(y for y in ['string_%s'%x for x in xrange(0,10)] if y in a)

    print check('hello string_1')

    0 讨论(0)
  • 2021-02-15 17:38
    >>> import re
    >>> string="word1testword2andword3last"
    >>> c=re.compile("word1|word2|word3")
    >>> c.search(string)
    <_sre.SRE_Match object at 0xb7715d40>
    >>> string="blahblah"
    >>> c.search(string)
    >>>
    
    0 讨论(0)
  • 2021-02-15 17:39

    Have you looked at filter?

    filter( lambda x: x in var_string, ["myString", "nextString"])
    

    which then can be combined with map to get this

    map( doSomething(), filter(lambda x: x in var_string, ["myString", "nextString"] ) )
    

    EDIT:

    of course that doesn't do what you want. Go with the any solution. For some reason I thought you wanted it done every time instead of just once.

    0 讨论(0)
  • 2021-02-15 17:46
    import re
    if re.search("string_1|string_2|string_n", var_strings): print True
    

    The beauty of python regex it that it returns either a regex object (that gives informations on what matched) or None, that can be used as a "false" value in a test.

    0 讨论(0)
提交回复
热议问题