Добавление элементов в список, когда они уже существуют и при использовании цикла for - PullRequest
0 голосов
/ 18 ноября 2018

Это довольно простой вопрос о списках и цикле.

Предполагая, что у меня есть следующий 2D-список:

[

['c', 'a', 't', 'c', 'a', 't']

['a', 'b', 'c', 'a', 't, 'l']

['c', 'a', 't', 'w', 'x', 'y']

]

И я хочу перебрать список, используя циклы for, каждый раз проверяя, есть ли слово 'cat' в списке. Если это так, я хочу добавлять его в список каждый раз, когда он появляется.

Так что мой результат должен быть ['cat', 'cat', 'cat, 'cat']

Моя функция получает список слов и заданную матрицу (2-й список, содержащий списки букв). Мой код:

def search_for_words(word_list, matrix):
    results = []
    for word in word_list:
        for line in matrix:
            line_string = ''.join(line)
                if word in line_string:
                    results.append(word)
    return results

И он выдаст мне просто 'cat', если cat есть в списке слов thr.

Я знаю, что, возможно, мне просто нужно еще одно утверждение if, но я могу это понять.

Заранее спасибо.

EDIT:

Я дал неправильный пример.

рассмотрим это:

matrix = [['a', 'p', 'p', 'l', 'e'], 
      ['a', 'g', 'o', 'd', 'o'],
      ['n', 'n', 'e', 'r', 't'],
      ['g', 'a', 'T', 'A', 'C'],
      ['m', 'i', 'c', 's', 'r'],
      ['P', 'o', 'P', 'o', 'P']]

word_list = ['apple', 'god', 'dog', 'CAT', 'PoP', 'poeT]

моя функция возвращает:

['apple', 'god', 'PoP']

Когда я ожидаю, что он дважды выдаст «PoP», потому что он появляется дважды в нижнем списке.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Ответ на ваш первый вопрос довольно прост.Просто создайте строку и проверяйте ее каждый раз.Потерять первую букву строки, если строка длиннее целевого слова.

outer = [['c', 'a', 't', 'c', 'a', 't'],
         ['a', 'b', 'c', 'a', 't', 'l'],
         ['c', 'a', 't', 'w', 'x', 'y']]

for inner in outer:
  word = ""
  target = "cat"
  t_len = len(target)
  for letter in inner:
    word += letter
    if len(word) > t_len:
      word = word[1:]
    if word in target:
      print(target)

Для ответа на второй вопрос вам, вероятно, лучше всего просто "".join() все строки и выполнить синтаксический анализ.их с регулярным выражением.

0 голосов
/ 18 ноября 2018

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

import re

def search_for_words(word_list, matrix):
    results = []
    for word in word_list:
        for line in matrix:
            line_string = ''.join(line)
            # find all overlapping matches of word in line_string
            matches = re.findall(r'(?=(' + word + '))', line_string)
            results.extend(matches)
    return results

Если мы запустим это для вашей второй матрицы:

m = [['a', 'p', 'p', 'l', 'e'], 
     ['a', 'g', 'o', 'd', 'o'],
     ['n', 'n', 'e', 'r', 't'],
     ['g', 'a', 'T', 'A', 'C'],
     ['m', 'i', 'c', 's', 'r'],
     ['P', 'o', 'P', 'o', 'P']]

word_list = ['apple', 'god', 'dog', 'CAT', 'PoP', 'poeT']

print(search_for_words(word_list, m))

мы видим следующий вывод:

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