2016-10-17 2 views
0

Я хотел бы проверить, есть ли в каждом элементе массива в Python два слова: «автомобиль» и «мотоцикл». Я знаю, как проверить одно слово с in, но не знаю, как это сделать с двумя словами. Действительно признателен за любую помощьPython - Проверьте, находятся ли два слова в строке

+3

Используйте логическое И оператор: 'if cond1 и cond2:' – Li357

+0

Просто используйте оператор 'and' –

ответ

4

Два решения слова:

for string in array: 
    if 'car' in string and 'motorbike' in string.split(): 
     print("Car and motorbike are in string") 

раствор н-слово, чтобы проверить, если все слова test_words в string:

test_words = ['car', 'motorbike'] 
contains_all = True 

for string in array: 
    for test_word in test_words: 
     if test_word not in string.split():: 
      contains_all = False 
      break 
    if not contains_all: 
     break 

if contains_all: 
    print("All words in each string") 
else: 
    print("Not all words in each string") 
+1

' all (карта (la mbda w: w в тексте, («автомобиль», «мотоцикл»))) 'намного чище ... – ldavid

+4

Ну, в некотором смысле вы правы. Однако это зависит от того, что вы подразумеваете под чистотой. Когда вы просматриваете каждую строку моего кода, очень очевидно, что происходит, тогда как в вашей строке я могу понять, что происходит, и вы тоже, но новичок может не понимать этого. Мой ответ был написан таким образом, что новичок должен понимать, что происходит, а не как oneliner для копирования. Тем не менее, в том смысле, что ваше решение занимает меньше места для одного и того же и может быть даже быстрее, вы правы! –

1

Используйте Подсобная логическое.

car=False 
motorbike=False 
for elem in array: 

     if "car" in elem: 
      car=True 
     if "motorbike" in elem: 
      motorbike=True 
     if car and motorbike: 
      break 

EDIT: Я просто прочитал «в каждом элементе». Просто используйте AND.

+0

использовать 'print' для указания наличия совпадения или нет – user2728397

0

Я думаю, что простое решение заключается в следующем:

all(map(lambda w: w in text, ('car', 'motorbike'))) 

Но может быть проблема с этим, в зависимости от того, насколько требователен вам нужно сравнение, чтобы быть:

>>> text = 'Can we buy motorbikes in carshops?' 
>>> all(map(lambda w: w in text, ('car', 'motorbike'))) 
True 

Слова «автомобиль 'и' motorbike 'НЕ находятся в text, и это все еще говорит True. Вам может потребоваться полное совпадение слов. Я бы сделал это:

>>> words = ('car', 'motorbike') 
>>> text = 'Can we buy motorbikes in carshops?' 
>>> set(words).issubset(text.split()) 
False 
>>> text = 'a car and a motorbike' 
>>> set(words).issubset(text.split()) 
True 

И теперь это работает!

+2

Нет необходимости в преобразовании' set' в параметре 'issubset', метод принимает итерабельность:' set (words) .issubset (text.split()) ' –

0

Я хотел бы использовать all функции:

wanted_values = ("car", "motorbike") 
all(vehicle in text for text in wanted_values) 

Так что, если у нас есть список строк:

l = ['some car and motorbike', 
    'a motorbike by a car', 
    'the car was followed by a motorbike'] 

lines_with_vehicles = [text for text in l 
         if all(vehicle in text for text in wanted_values)] 

С регулярными выражениями вы могли бы сделать:

# no particular order 
car_and_motorbike_pattern = re.compile(r'(car.*motorbike|motorbike.*car)') 
all(car_and_motorbike_pattern.search(text) for text in list_of_expressions) 

# This works too 
car_or_motorbike_pattern = re.compile(r'(car|motorbike)') 
get_vehicles = car_or_motorbike_pattern.findall 
all(len(set(get_vehicles(text))) == 2 for text in list_of_expressions) 
Смежные вопросы