2017-01-18 15 views
2

Я работаю в Python, используя any(), чтобы найти совпадение между массивом String[] и комментариями, извлеченными из API Reddit.Как найти то, что соответствует любому() с Python?

В настоящее время я делаю это так:

isMatch = any(string in comment.body for string in myStringArray) 

Но также было бы полезно не только знать, если isMatch верно, но элемент myStringArray это было то, что было спичкой. Есть ли способ сделать это с моим текущим подходом, или мне нужно найти другой способ поиска соответствия?

+4

просто удалить 'any' и выполнить проверку с явным циклом' for'. Я не вижу никакой проблемы здесь –

ответ

1

Вы можете использовать next с default=False на условном выражении генератора:

next((string for string in myStringArray if string in comment.body), default=False) 

по умолчанию возвращается, когда нет пункта, что соответствует (так как any возвращение False), в противном случае первый совпадающий элемент возвращается ,

Это примерно эквивалентно:

isMatch = False # variable to store the result 
for string in myStringArray: 
    if string in comment.body: 
     isMatch = string 
     break # after the first occurrence stop the for-loop. 

или если вы хотите иметь isMatch и whatMatched в различных переменных:

isMatch = False # variable to store the any result 
whatMatched = '' # variable to store the first match 
for string in myStringArray: 
    if string in comment.body: 
     isMatch = True 
     whatMatched = string 
     break # after the first occurrence stop the for-loop. 
+0

Действительно ли хорошая идея хранить * либо * bool, либо совпадающую строку в той же переменной? Кажется, что это слишком динамические типы. – brianpck

+1

'any' можно сразу понять, просто посмотрев на него. Цикл 'for' не будет намного хуже. Я смотрел на это минуту и ​​до сих пор не могу убедить себя, что это работает; что делает его плохим решением. –

+0

@MarkRansom Я включил версию без 'next', которая должна быть эквивалентной. На всякий случай это помогает понять, что происходит. :) – MSeifert

0

Я согласен с комментарием, что явный цикл будет ясным. Вы могли помадка оригинал так:

isMatch = any(string in comment.body and remember(string) for string in myStringArray) 
            ^^^^^^^^^^^^^^^^^^^^^ 

где:

def remember(x): 
    global memory 
    memory = x 
    return True 

Тогда глобальная memory будет содержать найденную строку, если isMatch является True или сохранить любое значение (если таковые имеются) его первоначально если isMatch - False.

+3

Я надеюсь, что это предназначено с юмором для проблемы, которую пытается решить ОП :) – brianpck

+0

Глобалы - это зло.Если вы действительно хотите использовать эту технику, создайте объект класса с членом, чтобы запомнить совпадение. –

2

Это не очень хорошая идея, чтобы использовать одну переменные для хранения двух различных видов информации: строка Независимо от того матчей (а bool) и , что этой строки (а string).

Вам действительно нужно только вторую часть информации: в то время как есть творческие способы сделать это в одном заявлении, как и в предыдущем ответе, это действительно имеет смысл использовать for цикл:

match = '' 
for string in myStringArray: 
    if string in comment.body: 
     match = string 
     break 

if match: 
    pass # do stuff 
+0

Положите это в функцию, и это прекрасно. –

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

  • Нет связанных вопросов^_^