Найти - Пользователи
Полная версия: Помогите новичку
Начало » Python для новичков » Помогите новичку
1 2 3 4 5
angree77
Всем доброго времени суток!
Я начинаю только изучать язык, просьба сильно не пинать, составляю программку для обсчета матрицы
на вход подается произвольных размеров матрица для примера рассматриваю 3х3
1 1 1
2 3 4
4 3 2
на выходе должна получится матрица 3х3 но уже с суммой элементов
 matrix[i][j] =  m[i - 1][j] + m[i + 1][j] + m[i][j - 1] + m[i][0] 
для более визуального представления
8 8 8
12 10 8
8 10 12
написан код:
m = []
z = []

while True:
lst = [str(i) for i in input().split()]
if lst[0] == 'end':#выход из ввода end
break
m.append(lst)
for i in range(len(m)): #преобразование значений матрицы из str в int
for j in range(len(m[0])):
m[i][j] = int(m[i][j])
print(m[i][j], end=' ')#промежуточный вывод значений матрицы
print()
g = len(m[0]) # определяем кол-во столбцов
v = len(m) # определяем кол-во строк
#print(g)
#print(v)
for i in range(g):
for j in range(v):
if i == g and j != v: # обход последней строки до предпоследнего символа
z[i][j] = m[i - 1][j] + m[0][j] + m[i][j - 1] + m[i][j + 1]
if j == v and i != g: #обход последнего столбца до предпоследнего символа
z[i][j] = m[i - 1][j] + m[i + 1][j] + m[i][j - 1] + m[i][0]
if i == g and j == v: #последний символ в строке/столбце
z[i][j] = m[i - 1][j] + m[0][j] + m[i][j - 1] + m[i][0]
if i!=g and j!=v: #обсчет всего остального
z[i][j] = m[i - 1][j] + m[i + 1][j] + m[i][j - 1] + m[i][j + 1] #тут вылетает с index out of range, не могу понять почему
print(z[i][j], end=' ') #вывод матрицы построчно
print()
Если объясните почему происходит index out of range и как лучше обсчитывать матрицу был бы очень благодарен
doza_and
angree77
почему происходит index out of range
Потому что:
  • Вы не понимаете как работает range.
  • Вы не пользуетесь отладчиком и не освоили другие приемы отладки. Без этого невозможно двигаться дальше. Выяснили строку, стройте гипотезы, делайте print индексов. Вы же не будете все свои ошибки через форумы править.
angree77
как лучше обсчитывать матрицу
  • Начинать надо с полного уяснения задачи. А вы пишете что нужно 4*m В примере результата другое в примере кода третье.
  • С матрицами работает пакет numpy.
angree77
doza_and
Вы не понимаете как работает range.
Хорошо если Вы такой умный объясните…
doza_and
Вы не пользуетесь отладчиком и не освоили другие приемы отладки. Без этого невозможно двигаться дальше. Выяснили строку, стройте гипотезы, делайте print индексов.
Да что Вы говорите? как раз таки отладчиком я и поймал эту ошибку и именно эту строку
angree77
z = m + m + m + m
doza_and
Вы же не будете все свои ошибки через форумы править.
нет конечно не буду, я попросил объяснить почему так происходит
doza_and
А вы пишете что нужно 4*m В примере результата другое в примере кода третье.
Вы очень не внимательны в результате и примере кода однотипное сложение двух крайних элементов по вертикали и по горизонтали прошу прощения когда писал условие задачи код забыл поставить вот индексы и съелись…
По троллить шли бы в другое место если помочь объяснить не можете , а тупо набиваете посты
Все равно что Вы пришли бы к доктору, начали объяснять что болит, а он Вам вместо того чтобы выписать лекарство сказал: Ну что вы хотели батенька, не знаете какие таблетки принимать и как лечится? …Идите отсюда погуглите, потом прийдете расскажете как вылечили
JOHN_16
не надо дублировать темы
JOHN_16
Здесь z это пустой список. Следующее использование z вы глядит уже так
 z[i][j] = ...
То есть вы делаете упрощенно говоря следующее
 >>> z = []
>>> z[0][0] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
Причина этого - нельзя обратиться к элементу списка по индексу которого не существует.

Я не смотрел внимательно ваш код, но кажется вам надо заранее сделать матрицу (в данном примере список списков) необходимого размера заполненную например нулями.
angree77
JOHN_16
Здесь z это пустой список. Следующее использование z вы глядит уже так z = …То есть вы делаете упрощенно говоря следующее
Спасибо добрый человек, попробую…
cдвинулся с мертвой точки наконец то.. щас хоть начала обсчитывать элементы первой строки, правда на последнем элементе вылетает… но это как говорится дело времени отловлю баг выложу готовый код программы
py.user.next
angree77
Я начинаю только изучать язык, просьба сильно не пинать, составляю программку для обсчета матрицы
на вход подается произвольных размеров матрица для примера рассматриваю 3х3

doza_and
Начинать надо с полного уяснения задачи.

Да, задача поставлена неточно и противоречиво. Неточность в том, что нужно сделать с матрицей. Там фигурирует i+1, что на последней строке матрицы даёт выход за её границы. Противоречивость в том, что матрица должна быть произвольного размера, однако уже в коде строки обрабатываются как столбцы, что подразумевает, что матрицы обязательно должны быть квадратными, иначе также произойдёт выход за границы матрицы.

angree77
По троллить шли бы в другое место если помочь объяснить не можете , а тупо набиваете посты
Зря ты так общаешься. Он здесь общался много и помогал, а ты здесь первый день. Его тут знают и ценят как участника, а ты ещё ничего не сделал, а уже начинаешь вносить смуту. Так что дам тебе совет: 1) когда на форум заходишь какой-нибудь, сначала приглядись; 2) никогда не нападай на старых участников, так как у них всегда существует неформальное сообщество (никак не оформленное) - ты нападёшь на одного, другой тебе ответит тем же, ты не будешь понимать, почему тебя игнорируют вообще все или сходу тебя посылают, хотя ты в отношении них ничего не делал; 3) почитай материалы по нетикету, там обычно многие понятия описаны в полной мере (будешь знать различия между флудом, флеймом и оффтопом), и там же пишут как заходить в чаты, что надо две недельки посидеть и просто почитать всех и только потом начинать писать, иначе можешь напороться на непонимание или сделать что-то непринятое, у тебя сложится плохая репутация и потом она будет липнуть к каждому твоему сообщению.
angree77
py.user.next
Зря ты так общаешься. Он здесь общался много и помогал, а ты здесь первый день. Его тут знают и ценят как участника, а ты ещё ничего не сделал, а уже начинаешь вносить смуту. Так что дам тебе совет: 1) когда на форум заходишь какой-нибудь, сначала приглядись; 2) никогда не нападай на старых участников, так как у них всегда существует неформальное сообщество (никак не оформленное) - ты нападёшь на одного, другой тебе ответит тем же, ты не будешь понимать, почему тебя игнорируют вообще все или сходу тебя посылают, хотя ты в отношении них ничего не делал; 3) почитай материалы по нетикету, там обычно многие понятия описаны в полной мере (будешь знать различия между флудом, флеймом и оффтопом), и там же пишут как заходить в чаты, что надо две недельки посидеть и просто почитать всех и только потом начинать писать, иначе можешь напороться на непонимание или сделать что-то непринятое, у тебя сложится плохая репутация и потом она будет липнуть к каждому твоему сообщению.
эээ дружище, с таким подходом каши не сваришь…
во первых если обращаются за помощью, конкретно за советом, что бы ты сделал: (не зная ответа на вопрос)
1. дал бы совет бесполезный?
2. наехал бы на участника, что он дуб и это не его, послал бы в гугл читать доки?
3. или попросил уточнить моменты, проанализировал бы код и дал направление в котором искать ответ?
если твои ответы первые 2 то разговаривать не о чем…
Вон JOHN_16 быстро проанализировал код и дал направление в котором, рыть дальше…
я за эту ночь сдвинулся дальше чем за два дня бесплодных попыток обойти ошибку
так что давай не будем выяснять кто на кого напал, по факту получилось
angree77
Все равно что Вы пришли бы к доктору, начали объяснять что болит, а он Вам вместо того чтобы выписать лекарство сказал: Ну что вы хотели батенька, не знаете какие таблетки принимать и как лечится? …Идите отсюда погуглите, потом прийдете расскажете как вылечили свой недуг
py.user.next
Он здесь общался много и помогал
а на эту тему скажу есть хорошо известная притча, но это уже будет офтоп
angree77
Программа начинает обсчитывать матрицы от 2х2 и в сторону увеличения, пока не дотюнькал как сделать с одним элементом, с одним столбцом и одной строкой
m = []                                                                                      
z = []

while True:
lst = [str(i) for i in input().split()]
if lst[0] == 'end':
break
m.append(lst)
v = len(m[0]) # определяем кол-во столбцов
g = len(m) # определяем кол-во строк
for i in range(len(m)):
for j in range(len(m[0])):
m[i][j] = int(m[i][j])
z = [[0 for j in range(v)] for i in range(g)]
for i in range(g):
for j in range(v):
if i == g - 1 and j != v - 1: # обход последней строки до предпоследнего символа
z[i][j] = m[i - 1][j] + m[0][j] + m[i][j - 1] + m[i][j + 1]
if j == v - 1 and i != g - 1: # обход последнего столбца до предпоследнего символа
z[i][j] = m[i - 1][j] + m[i + 1][j] + m[i][j - 1] + m[i][0]
if i == g - 1 and j == v - 1: # последний символ в строке/столбце
z[i][j] = m[i - 1][j] + m[0][j] + m[i][j - 1] + m[i][0]
if i == 0 and j == 0:
z[i][j] = m[-1][0] + m[1][0] + m[0][-1] + m[0][1]
if i != g - 1 and j != v - 1: # обсчет всего остального
z[i][j] = m[i - 1][j] + m[i + 1][j] + m[i][j - 1] + m[i][j + 1]
print(z[i][j], end=' ')
print()
Предложения и мысли только по существу….
для одного элемента получается что все его 4 соседа будут являться им самим
для столбца что крайние соседи по горизонтали он сам
и для строки что соседи сверху и снизу это сам элемент будет
осталось только все как то это скомпоновать в одну программу
py.user.next
angree77
во первых если обращаются за помощью, конкретно за советом, что бы ты сделал
Я бы сделал то же самое - послал бы тебя за заданием. Ты не привёл задание, написал какую-то противоречивую, мутную хрень и пытаешься её решить.

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

В последнем твоём коде я вижу все те же самые ошибки с выходом за границы матрицы.

doza_and посоветовал тебе прочитать про range(), JOHN_16 показал тебе неправильную индексацию в списке. Судя по всему, ты действительно не понимаешь, что range() на последней итерации даст последний индекс в списке, и ты действительно не понимаешь, что для последнего индекса нельзя делать i + 1 или j + 1. Так что тебе всё правильно посоветовали.

Ты и задание неправильно составил, и код неправильно написал. Тебе нужно исправить и то, и другое.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB