добавление символа в строку в Python - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь решить следующий вопрос:

Строка «PAYPALISHIRING» написана зигзагообразно на заданном количестве строк, например так: (вы можете захотеть отобразить этот шаблон фиксированным шрифтом для лучшей читаемости)

P   A   H   N
A P L S I I G
Y   I   R

А затем прочитайте построчно: "PAHNAPLSIIGYIR"

Напишите код, который будет принимать строку и выполнить это преобразование с учетом количества строк:

преобразование строки (строка s, int numRows);

Я написал следующий код, но получаю сообщение об ошибке в жирной строке "TypeError: неподдерживаемые типы операндов для +: 'NoneType' и 'unicode'"

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        if numRows==1:
            return s

        templist=[None]*numRows
        ret=" "

        curRow=0
        goingDown=0
        for each_char in s:
            if templist[curRow]:
                templist[curRow]=each_char
            else:
                **templist[curRow]=templist[curRow] + each_char**
            if (curRow==numRow-1 or curRow == 0):
                goingDown = not goingDown
            if goingDown:
                curRow=curRow+1
            else:
                curRow=curRow-1

        for each_str in templist:
            ret=ret+each_str
        print ret

Я что-то не так делаю в этом. Было бы здорово, если бы кто-то мог указать на проблему здесь. Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018
string = 'PAHNAPLSIIGYIR'
string = list(string)
rows = []

def make_output(string, num_rows):
    i = 0
    while i < num_rows:
        if i%2 == 0:
            a = []
            while len(a) < 4:
                if len(string)==0:
                    break
                a.append(string.pop(0)) 
            rows.append(a)
        if i%2 != 0:
            a = []
            while len(a) < 7:
                a.append(string.pop(0)) 
            rows.append(a)
        i += 1

    for i in range(len(rows)):
        if i%2 == 0:
            print('   '.join(rows[i]))
        if i%2 != 0:
            print(' '.join(rows[i]))

make_output(string,  3)  

Вы можете использовать функцию, подобную этой, где вы определяете длины для четных и нечетных строк, тогда вы можете pop из вашей строки. Тогда вы можете просто print четные и нечетные строки с правильным интервалом.

(xenial)vash@localhost:~/python/AtBS$ python3.7 solve.py
P   A   H   N
A P L S I I G
Y   I   R

(xenial)vash@localhost:~/python/AtBS$ python3.7 solve.py
M   M   *   H
Y A E S V S *
N   I   A
0 голосов
/ 09 сентября 2018

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

        if templist[curRow]:
            templist[curRow]=each_char
        else:
            **templist[curRow]=templist[curRow] + each_char**

Вероятно, следует читать:

        if templist[curRow]:
            templist[curRow]=templist[curRow] + each_char
        else:
            templist[curRow]=each_char

Это гарантирует, что он добавляется к строке только в templist[curRow], если эта строка уже существует (не None), и, таким образом, исключает ошибку добавления строки в None.

Лучшим способом было бы установить templist = [""] * numRows, то есть список пустых строк, а затем просто добавить к нему, используя templist[curRow] += each_char, который всегда будет работать, потому что вы можете добавить символ в пустую строку.

0 голосов
/ 09 сентября 2018

Да, вы делаете что-то не так.

В строке templist=[None]*numRows ваша переменная templist содержит набор None с. Затем вы переходите к одному из этих None и пытаетесь «добавить» один из них в строку с выражением, выделенным жирным шрифтом: templist[curRow]=templist[curRow] + each_char (т. Е. Правая часть этого назначения оценивается как None + each_char ).

Вы не можете добавить строку и None в Python, следовательно, ошибка.

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