The question is not exactly trivial. One way to check if words are contained in columns is to use zip
to get a letter from each column and form column strings:
# Criar lista de palavras e matriz
palavras = ['python', 'hub']
matriz = \
"""u l i o a
e a p b e
a r y l s
j i t u a
e e h u b
e u o r r
c t n e p
b i o s b"""
# Pegar linhas da matriz e remover espaços
linhas = [linha.replace(' ', '') for linha in matriz.split('\n')]
print(linhas) # ['ulioa', 'eapbe', 'aryls', ...]
# Usamos zip pra pegar uma letra de cada linha e join
# pra formar uma string pra cada coluna
colunas = [''.join(coluna) for coluna in zip(*linhas)]
print(colunas) # ['ueajeecb', 'larieuti', 'ipythono' ...]
# Criamos um set pra guardar a posição das letras que
# vamos mostrar na representação final.
letras_a_mostrar = set()
# Pra cada palavra na nossa lista de palavras a procurar,
# vemos se a palavra está em uma das linhas ou colunas.
# Se estiver, adicionamos a posição de todas as letras
# da palavra ao set letras_a_mostrar.
for palavra in palavras:
# Pra cada linha na matriz...
for y, linha in enumerate(linhas):
# Se a palavra que estamos verificando estiver
# na linha...
if palavra in linha:
# Encontrar a posição de início e fim da palavra na linha
comeco_palavra = linha.find(palavra)
fim_palavra = linha.find(palavra) + len(palavra)
# Adicionar as posições de início, fim, e intermediárias
for x in range(comeco_palavra, fim_palavra):
letras_a_mostrar.add((x, y))
# Fazer a mesma coisa pra colunas da matriz.
# Como temos um set, não importa se tentarmos
# adicionar posições duplicadas (se duas palavras se
# cruzarem)
for x, coluna in enumerate(colunas):
if palavra in coluna:
comeco_palavra = coluna.find(palavra)
fim_palavra = coluna.find(palavra) + len(palavra)
for y in range(comeco_palavra, fim_palavra):
letras_a_mostrar.add((x, y))
print(letras_a_mostrar) # {(2, 6), (4, 4), (2, 1), ... ]
# Pra apresentar o resultado destacado, iteramos sob
# as posições x, y da matriz e printamos a letra da
# posição se ela estiver na lista de letras a mostrar
for y in range(len(linhas)):
for x in range(len(linhas[y])):
if (x, y) in letras_a_mostrar:
print(linhas[y][x] + ' ', end='')
else:
print('. ', end='')
print('') # Linha nova
# . . . . .
# . . p . .
# . . y . .
# . . t . .
# . . h u b
# . . o . .
# . . n . .
# . . . . .