2015-02-16 3 views
-2

Я пытаюсь проверить, есть ли строка в test_list2 в каждой строке test_list1. Если строка в test_list2 присутствует в test_list1, я хочу добавить 1 в новый список, иначе добавьте 0 в тот же новый список.Проверка наличия строки в списке в другом списке строк Python

Итак:

test_list1 = [['Happy', 'Dog'], ['Sad', 'Dog'], ['Dog', 'Dog'], ['Angry', 'Dog']] 
test_list2 = ['Happy', 'Sad', 'Angry'] 
new_list = [] 

def emotion_detection(x, y): 
    for i in x: 
     if i in y: 
      new_list.append(1) 
     if i not in y: 
      new_list.append(0) 
    print new_list 

возвращается: [0, 0, 0, 0], когда я думаю, что он должен вернуться [1,1,0,1]

Заранее спасибо за любую помощь !

+1

как 'emotion_detection' называют? Используйте значащие имена для 'x' и' y'. –

+0

Вы можете начать с предоставления значимых имен вашим переменным в функции, начиная с __x__ и __y__. Например, один из них я бы назвал __emotion_list__, другой __tested_lists__. – volcano

ответ

1

Это логическое поведение, которое вы ожидаете?

test_list1 = [['Happy', 'Dog'], ['Sad', 'Dog'], ['Dog', 'Dog'], ['Angry', 'Dog']] 
test_list2 = ["Happy", "Sad", "Angry"] 
new_list = [] 

def emotion_detection(x, y): 
    for i in x: 
     for string in i: 
      if string in y: 
       new_list.append(1) 
       break 
     else: 
      new_list.append(0) 
    print new_list 
+0

Да, это отлично! Спасибо! – Questionlol

0
test_list1 = [['Happy', 'Dog'], ['Sad', 'Dog'], ['Dog', 'Dog'], ['Angry', 'Dog']] 
test_list2 = ["Happy", "Sad", "Angry"] 
new_list = [] 

for element in test_list1: 
    if element[0] in test_list2: 
     new_list.append(1) 
    else: 
     new_list.append(0) 
print new_list 

вместо использования i используйте i[0], который является индексом эмоций!

1
emotions = set(["Happy", "Sad", "Angry"]) 
sentences = ['Happy Dog', 'Sad Dog', 'Dog Dog', 'Angry Dog'] 

def is_emotional(sentence): 
    words = sentence.split() 
    return bool(emotions.intersection(words)) 

sentence_emotions = [is_emotional(sentence) for sentence in sentences] 
# gives [True, True, False, True] 

Edit: Hackaholic имеет хорошую идею с any, но я бы написать это как

def is_emotional(sentence): 
    return any(word in emotions for word in sentence.split()) 

, который может быть быстрее, особенно для длинных предложений, так как он останавливается, как только как слово эмоции найдено.

+0

эй ваш и мой примерно такой же подход, ожидают 'bool и any'. так что я задаюсь вопросом, что быстрее bool или любой ??? – Hackaholic

+0

Спасибо! Это действительно помогает. Я прочитал в предыдущих связанных потоках, что использование «set» вместо списков может помочь в сочетании с «пересечением», но я не был уверен, как его применять. Это определенно проясняет некоторые неправильные представления, которые у меня были. – Questionlol

0

попробовать так:

>>> test_list1 = [['Happy', 'Dog'], ['Sad', 'Dog'], ['Dog', 'Dog'],['Angry', 'Dog']] 
>>> test_list2 = ["Happy", "Sad", "Angry"] 
>>> [any(set(x)&set(test_list2)) for x in test_list1] 
[True, True, False, True] 
0

Использование списковых:

new_list = [k[0] in test_list2 for k in test_list1] 
+0

Должно быть '[int (k [0] в test_list2) для k в test_list1]' для соответствия типам результатов OP. –

+0

Это не имеет большого значения. –

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