Мой список принимает повторяющиеся элементы, и я не знаю почему - PullRequest
0 голосов
/ 26 января 2019

У меня есть список строк в списке под названием «тексты».Я пытаюсь отсканировать каждую строку для каждого из слов в списке под названием «ключевые слова».Если в строке есть какое-либо из ключевых слов, оно помещается в «list1».Если в строке нет ни одного ключевого слова, оно помещается в «list2».Моя цель - чтобы каждая строка была в соответствующем списке один раз.Проблема в том, что, поскольку у меня есть три слова в «key_words», строка с любым из этих слов попадет в list1 три раза.Я не знаю, почему это происходит, и я застрял, работая над этим в течение часа, хотя это кажется довольно простым.Любая помощь с благодарностью.

У меня есть список строк в списке под названием "тексты".

list1 = []
list2 = []
key_words = ['must', 'should', 'wish']

for text in texts:

    for word in key_words:

        if text not in list1 and text not in list2:

            if word in text:
                 list1.append(text)

            else:
                list2.append(text)

Ответы [ 4 ]

0 голосов
/ 26 января 2019

Вам нужно отсканировать слова в text, а не в списке key_words. Последний просто используется для проверки состояния и определения для list1 или list2.

Это опция, использующая re.findall библиотеку для разбиения текста на слова, без пунктуации . После того, как у вас есть список слов, вы можете перебрать его и проверить, входит ли каждое слово в key_words.

В следующем примере я использую только одну текстовую строку, вы можете расширить код для списка текстов.

Вот что происходит с text при применении метода re.findal l:

text = 'Must the show go on? I wish, it should! It must.'
print(re.findall(r'\w+',text))
#=> ['Must', 'the', 'show', 'go', 'on', 'I', 'wish', 'it', 'should', 'It', 'must']

Поиск текста выполняется один раз при запуске цикла, здесь приведен полный код:

for txt_word in re.findall(r'\w+',text):
  if txt_word.lower() in key_words: # <- note .lower()
    list1.append(txt_word) # just add if not in list1 if you don't want duplicates
  else:
    list2.append(txt_word)

Это вывод:

print(list1) #=>['Must', 'wish', 'should', 'must']
print(list2) #=> ['the', 'show', 'go', 'on', 'I', 'it', 'It']
0 голосов
/ 26 января 2019

Во-первых, в вашем коде есть ошибка:

Если любое из ключевых слов находится в text, оно должно перейти к list1

Однако в своем коде вы немедленно копируете текст в list2, даже если первое ключевое слово отсутствует.Хитрость, чтобы решить это просто в цитате выше.Вот простое и эффективное решение:

import re

keyword_regex = '|'.join(key_words)  # Compile the regex if you have to use many times

for text in texts:
    if re.search(keyword_regex, text):  # Success if any keyword is in text
        list1.append(text)
    else:
        list2.append(text)
0 голосов
/ 26 января 2019

Он будет сканировать весь текстовый документ и добавлять слово «текст» в соответствующий список, если слово «текст» ранее не было вставлено.

list1 = []
list2 = []
key_words = ['must', 'should', 'wish']

for text in texts:
    for word in key_words:
       if (word in text and not in list1):
          list1.append(text)
       elif (word not in list2):
          list2.append(text)
0 голосов
/ 26 января 2019

Когда вы перебираете ключевые слова, вы добавляете текст в списки несколько раз.

list1 = []
list2 = []
key_words = ['must', 'should', 'wish']
texts = ["must the a hooray", "hooray should the a", "a the an"]

for text in texts:

    found = False
    if text not in list1 and text not in list2:
        for word in key_words:

                if word in text:
                     found = True
                     break
        if found:
            list1.append(text)
        else:
            list2.append(text)

print(list1)
print(list2)

Генерирует:

['must the hooray', 'hoorayдолжен a ']

[' a an ']

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