Почему он печатает в два раза больше "большой" диагонали (матрица) - PullRequest
1 голос
/ 01 декабря 2019

У меня есть матрица, подобная следующей:

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

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

`test_word = ''
for upper in range(len(matrix)):
    for rep1 in range(min(upper + 1, len(matrix[0]))):
        for rep2 in range(rep1, min(upper + 1, len(matrix[0]))):
            for j in range(rep1, rep2 + 1):
                test_word += (matrix[upper - j][j])
                print(test_word)
            test_word = ''`

вывод:

 `
P,m,m,mo,o,g,g,gi
......when it arrives to the diagonal anTsP here is the output:
a,a,an,a,an,anT,a,an,anT,anTs,a,an,anT,anTs,anTsP` 

Проблема в том, что он повторяется дважды a, an, anTs ... Если вы не поняли шаблон, я хочу просмотреть каждую диагональ и попытаться найти все пути«записать» букву, поэтому, например, мой идеальный вывод для диагонали anTsP будет:

a, an, anT, anTs, anTsP, n,nT,nTs,nTsP, T, etc.

Если у вас есть какие-либо идеи,

1 Ответ

0 голосов
/ 01 декабря 2019

Похоже, что в вашем выражении print есть неправильный отступ:

test_word = ''
for upper in range(len(matrix)):
    for rep1 in range(min(upper + 1, len(matrix[0]))):
        for rep2 in range(rep1, min(upper + 1, len(matrix[0]))):
            for j in range(rep1, rep2 + 1):
                test_word += (matrix[upper - j][j])
            print(test_word, end=' ')  # <--- indent left
            test_word = ''

Но это, однако, только для печати:

P m mo o g gi giP i iP P n na nac naco a ac aco c co o a an anT anTs anTsP n nT nTs nTsP T Ts TsP s sP P a ag age ageA ageAr g ge geA geAr e eA eAr A Ar r

Не * 'porC, 'pdt', 'lo', 'e' диагонали.


В этом примере печатаются все диагонали:

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

def rotate(l, n):
    return l[n:] + l[:n]

def get_substrings(s):
    for j in range(0, len(s)):
        for i in range(j+1, len(s)+1):
            yield s[j:i]

def get_values(matrix):
    transposed = [*zip(*matrix)]
    for i in range(len(matrix[0])):
        transposed[i] = rotate(transposed[i], -i)
    transposed = [*zip(*transposed)]
    for i, lst in enumerate(transposed, 1):
        yield from get_substrings(''.join(lst[:i]))
    for i, lst in enumerate(transposed, 1):
        yield from get_substrings(''.join(lst[i:]))

for v in get_values(matrix):
    print(v, end=' ')

Отпечатки:

P m mo o g gi giP i iP P n na nac naco a ac aco c co o a an anT anTs anTsP n nT nTs nTsP T Ts TsP s sP P a ag age ageA ageAr g ge geA geAr e eA eAr A Ar r p po por porC o or orC r rC C p pd pdt d dt t l lo o e

Редактировать: версия без yield:

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

def rotate(l, n):
    return l[n:] + l[:n]

def get_substrings(s):
    rv = []
    for j in range(0, len(s)):
        for i in range(j+1, len(s)+1):
            rv.append(s[j:i])
    return rv

def get_values(matrix):
    rv = []
    transposed = [*zip(*matrix)]
    for i in range(len(matrix[0])):
        transposed[i] = rotate(transposed[i], -i)
    transposed = [*zip(*transposed)]
    for i, lst in enumerate(transposed, 1):
        rv.extend(get_substrings(''.join(lst[:i])))
    for i, lst in enumerate(transposed, 1):
        rv.extend(get_substrings(''.join(lst[i:])))
    return rv

for v in get_values(matrix):
    print(v, end=' ')
...