Упрощение выражения в Python - PullRequest
3 голосов
/ 20 июня 2011

Я считаю, что должен быть более простой / понятный / быстрый (выберите один или несколько) способ написания этого выражения ...

take BigString = "Это длинное предложение о рыжем коте по имени чувак."

и LittleStringList = ["красная собака", "красная кошка", "красная мышь"]

Мне действительно нужна функция / выражение, которое возвращает true, когда один из LittleStringList находится в BigString. Я написал это так:

def listcontains(list, big):
    contains = False
    for string in list:
        if string in big:
            contains = True
        else:
            pass
    return contains

Любая помощь приветствуется! Благодаря.

edit: исправлена ​​небольшая ошибка!

Ответы [ 6 ]

11 голосов
/ 20 июня 2011

any([s in BigString for s in LittleStringList])

или даже лучше, используя выражение генератора - как указано @GWW:

any(s in BigString for s in LittleStringList)

3 голосов
/ 20 июня 2011

используйте любой ():

>>> BigString = "This is a long sentence about a red cat named dude."
>>> LittleStringList = [ "red dog", "red cat", "red mouse" ]
>>> any([str in BigString for str in LittleStringList])
True

>>> BigString = "This is a long sentence about a red bear named dude."
>>> any([str in BigString for str in LittleStringList])
False
1 голос
/ 20 июня 2011
  1. Вам не нужно переходить по всему списку, возвращаться при первом совпадении
  2. Не используйте string в качестве имени переменной, это модуль, str это тип, лучшеслово будет word.
  3. Не используйте list в качестве имени переменной
  4. Вы выполняете цикл на list и проверяете снова на list вместо большого

т.

def listcontains(words, big):
    for word in words:
        if word in big:
            return True
    return False
1 голос
/ 20 июня 2011

Полагаю, вы имеете в виду if string in big? Может быть, тогда попробуйте:

def listcontains(list, big):
    return any([string in big for string in list])

Или версия с генератором:

def listcontains(list, big):
    def gen():
        for s in list:
            yield s in big
    return any(gen())
0 голосов
/ 20 июня 2011

any(filter(lambda x: x in BigString, LittleStringList))

фильтр вернет список со словами LittleStringList внутри BigString, а любой вернет true, если фильтр вернет список с некоторым вхождением

0 голосов
/ 20 июня 2011

Чтобы немного его сократить, вместо этого можно написать:

def listcontains(list, big):
    for s in list:
        if s in big:
            return True
    return False
...