这是一个关于列表和for循环的非常简单的问题。
假设我具有以下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']
我的函数接收一个单词列表和一个给定的矩阵(包含字母列表的2d列表)。 我的代码是:
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”。
我知道我可能只需要另一个if语句,但是我可以弄清楚。
谢谢。
编辑:
我举了一个错误的例子。
考虑这一点:
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 = ['苹果','神','狗','CAT','PoP','poeT]
我的函数返回:
['apple','god','PoP']
当我希望它返回两次“ PoP”时,因为它在底部列表中出现了两次。
答案 0 :(得分:4)
问题是您没有检查子字符串在字符串中出现了多少次。您还需要考虑overlapping matches:
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']
答案 1 :(得分:1)
第一个问题的答案非常简单。只需构建一个字符串,然后每次检查它。如果字符串比目标单词长,则丢失字符串的第一个字母。
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()
所有字符串并使用正则表达式进行解析。