Сравнить строку со всеми значениями в массиве - PullRequest
25 голосов
/ 06 мая 2010

Я пытаюсь покопаться в питоне и узнать, как лучше всего это делать. У меня есть строка, где я делаю сравнение с другой строкой, чтобы увидеть, есть ли совпадение:

if paid[j].find(d)>=0:
    #BLAH BLAH

Если бы 'd' был массивом, какой самый эффективный способ узнать, соответствует ли строка, содержащаяся в paid [j], любому значению в 'd'?

Ответы [ 4 ]

43 голосов
/ 07 мая 2010

Если вы хотите узнать, содержится ли любой элемент d в paid[j], как вы буквально скажете:

if any(x in paid[j] for x in d): ...

Если вы также хотите узнать , какие элементы d содержатся в paid[j]:

contained = [x for x in d if x in paid[j]]

contained будет пустым списком, если в paid[j].

нет элементов d.

Есть и другие решения, если вам нужна еще одна альтернатива, например, получите первый элемент d, содержащийся в paid[j]None, если ни один элемент не содержится в нем) :

firstone = next((x for x in d if x in paid[j]), None)

Кстати, поскольку в комментарии вы упоминаете предложения и слова, может быть, вы не обязательно хотите проверять string (что и делают все мои примеры), потому что они не могут учитывать слово границы - например, каждый пример скажет, что «cat» имеет значение in «obfuscate» (потому что «obfuscate» содержит «cat» в качестве подстроки ). Чтобы разрешить проверки границ слов, а не простые проверки подстрок, вы можете продуктивно использовать регулярные выражения ... но я предлагаю вам открыть отдельный вопрос на этот счет, если это то, что вам требуется, - все фрагменты кода в этом ответе, в зависимости от по вашим точным требованиям будет работать одинаково хорошо, если вы измените предикат x in paid[j] на более сложный предикат, такой как somere.search(paid[j]), для соответствующего объекта RE somere. (Python 2.6 или выше - небольшие различия в 2.5 и более ранних версиях).

Если ваше намерение является чем-то другим, например, получение одного или всех индексов в d элементов, удовлетворяющих вашему ограничению, то есть и простые решения для этих разных проблем ... но если то, что вам действительно нужно, настолько далеко от того, что вы сказали, я бы лучше перестал догадываться и надеюсь, что вы проясните; -).

8 голосов
/ 06 мая 2010

Полагаю, вы имеете в виду list, а не array? В Python есть такая вещь, как массив, но чаще всего вам нужен список вместо массива.

Чтобы проверить, содержит ли список значение, используйте in:

if paid[j] in d:
    # ...
4 голосов
/ 06 мая 2010

В Python вы можете использовать оператор in. Вы можете сделать что-то вроде этого:

>>> "c" in "abc"
True

Далее, вы можете проверить наличие сложных структур, таких как кортежи:

>>> (2, 4, 8) in ((1, 2, 3), (2, 4, 8))
True
1 голос
/ 07 мая 2010
for word in d:
    if d in paid[j]:
         do_something()

попробует все слова в списке d и проверит, можно ли их найти в строке paid[j].

Это не очень эффективно, поскольку paid[j] нужно сканировать снова для каждого слова в d. Вы также можете использовать два набора, один из которых состоит из слов в предложении, один из вашего списка, а затем посмотреть на пересечение наборов.

sentence = "words don't come easy"
d = ["come", "together", "easy", "does", "it"]

s1 = set(sentence.split())
s2 = set(d)

print (s1.intersection(s2))

Выход:

{'come', 'easy'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...