Задача со списками,нужна помощь при поиске индекса одинаковых элементов списка

Evoli

Новичок
Пользователь
Авг 1, 2020
5
1
3
Всем привет.Занимаюсь на степике и застрял на решение одной задачки.Если сможете дайте подсказку для решения пожалуйста.Проблема возникает при получении индексов элемента с одинаковыми значениями. Например,если список ['1', '2', '2'] Возвращаемые индексы будут 0 1 1 ,а мне нужно 0 1 2 (

Условие:

Напишите программу, на вход которой подаётся прямоугольная матрица в виде последовательности строк, заканчивающихся строкой, содержащей только строку "end" (без кавычек)

Программа должна вывести матрицу того же размера, у которой каждый элемент в позиции i, j равен сумме элементов первой матрицы на позициях (i-1, j), (i+1, j), (i, j-1), (i, j+1). У крайних символов соседний элемент находится с противоположной стороны матрицы.

В случае одной строки/столбца элемент сам себе является соседом по соответствующему направлению.

Код:
b = []
b3 = []
b4 = []
x = 0
x2 = 0
while True:
    a = [input().split()]
    if 'end' in str(a):
        break
    b += a
for i in b:
    for j in i:
        # (i - 1, j) + (i + 1, j) + (i, j-1) + (i, j + 1)
        #2 2 2 3 0 5
        #8 -4 3 5 1 0

#Ошибка в этой формуле
        x = (int(b[b.index(i) - 1][i.index(j)]) + int(b[b.index(i) - len(b) + 1][i.index(j)]) + 
              int(b[b.index(i)][i.index(j) - 1]) + int(b[b.index(i)][i.index(j) - len(i) + 1]))

        b3 += [x]
        if len(b3) % len(i) == 0:
            b4 += [b3]
            b3 = []
#if len(b) == len(b4):
    #print('По длинне входящего и выходящего списков все ок')
b = b4
#print(b)

for i in range(len(b)): # for i in range(0,1)
    for j in range(len(b[i])):
        print(b[i][j], end = ' ')
    print()







#print(s) #[3, 21, 22, 10, 6, 19, 20, 16, -1]
#print(int((b[-1][0])) + int((b[1][0])) + int((b[0][-1])) + int((b[0][1])))
#
#          j
#       9 5 3
#    i  0 7 -1
#       -5 2 9

#(i - 1, j) + (i + 1, j) + (i, j-1) + (i, j + 1)

#3 21 22
#10 6 19
#20 16 -1
 
Последнее редактирование:

alext

Популярный
Пользователь
Май 10, 2020
288
66
28
Python:
matrix  = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]
cycle = lambda n: lambda x: 0 if x >= n else n-1 if x < 0 else x
nx, ny = len(matrix[0]), len(matrix)
cyclex, cycley = cycle(nx), cycle(ny)
coords = (1, 0), (-1, 0), (0, 1), (0, -1)
new = [[sum(matrix[cycley(y+j)][cyclex(x+i)] for i, j in coords) for x in range(nx)] for y in range(ny)]
print('\n'.join(''.join(f"{x:3}" for x in row) for row in new))
 

Evoli

Новичок
Пользователь
Авг 1, 2020
5
1
3
Спасибо за решение Алекс ,но там стоит задача немного по-другому. На вход программа должна принимать элементы матрицы через пробел,например 1 2 3 4 5 6. После нажатия на ентер можно вводить следующую строку но обязательно того же размера что и первая, 7 8 9 10 11 12 например. И после того,как мы на следующей строке введем end программа перестает считывать строки матрицы и выводит результат. Вот ,для упрощения есть тест кейсы с входными и выходными данными для понимания как правильно должна работать программа:
Вход - 1
Выход - 4

Кейс 2:
Вход - 15 -4 8 3
Выход - 29 15 15 29

Кейс 3:
Вход -
0
7
9
12
Выход -
19
23
37
33

Кейс 4:
Вход -
2 2 2 3 0 5
8 -4 3 5 1 0
Выход -
23 -4 11 12 10 2
0 15 5 10 5 19

Кейс 5:
Вход -
2 2
3 5
-1 7
0 1
Выход -
7 10
11 15
17 4
3 9

Кейс 6 с текущей страницы:
Вход -
9 5 3
0 7 -1
-5 2 9
Выход -
3 21 22
10 6 19
20 16 -1
 

Evoli

Новичок
Пользователь
Авг 1, 2020
5
1
3
Вроде как ребята нашел решение(ввел переменную hope),но почему-то автотест на сайте все равно не прохожу,очень обидно(
Чтож,буду переделывать ее с нуля наверное.Но если кто-то подскажет что не так с этим кодом я буду безумно признателен вам
Python:
b = []
b3 = []
b4 = []
x = 0
x2 = 0
while True:
    a = [input().split()]
    if 'end' in str(a):
        break
    b += a
hope = 0
for i in b:
    for j in i:
        # (i - 1, j) + (i + 1, j) + (i, j-1) + (i, j + 1)
        #2 2 2 3 0 5
        #8 -4 3 5 1 0

        x = (int(b[b.index(i) - 1][hope]) + int(b[b.index(i) - len(b) + 1][hope]) +
              int(b[b.index(i)][hope - 1]) + int(b[b.index(i)][hope - len(i) + 1]))
        hope += 1
        if hope == len(i):
            hope = 0

        b3 += [x]
        if len(b3) % len(i) == 0:
            b4 += [b3]
            b3 = []
#if len(b) == len(b4):
   #print('По длинне входящего и выходящего списков все ок')
b = b4
#print(b)

for i in range(len(b)): # for i in range(0,1)
    for j in range(len(b[i])):
        print(b[i][j], end = ' ')
    print()
 

Jerry

Пользователь
Пользователь
Июл 28, 2020
29
12
3
Вроде как ребята нашел решение(ввел переменную hope),но почему-то автотест на сайте все равно не прохожу,очень обидно(
Чтож,буду переделывать ее с нуля наверное.Но если кто-то подскажет что не так с этим кодом я буду безумно признателен вам

Попробуйте на вашем коде входные данные
Код:
1
2
0
1

Внимательно почитайте описание метода index типа list

Можно искать с указанием диапазона поиска, но в данном случае есть такой вариант:
Python:
fruits = ['apple', 'banana', 'grapes', 'pear']

for index, value in enumerate(fruits):
    print(index, value)

Вывод:
Bash:
0 apple
1 banana
2 grapes
3 pear
 
Последнее редактирование:
  • Мне нравится
Реакции: Evoli

Evoli

Новичок
Пользователь
Авг 1, 2020
5
1
3
Ребят,решил,ура!!Почитал побольше про списки и решил.Джерри спасибо огромное,сейчас почитаю твою подсказку но я решил и так.Блин скоко радости ппц ЯХУУ!!!)))
Код:
b = []
b2 = []
while True:
    a = [input().split()]
    if 'end' in str(a):
        break
    b += a
for i in range(len(b)):
    for j in range(len(b[i])):
        b[i][j] = int(b[i][j])
b2 = [[0 for i in range(len(b[0]))] for j in range(len(b))]
for i in range(len(b2)):
    for j in range(len(b2[i])):
        b2[i][j] = b[i - 1][j] + b[i - len(b) + 1][j] + b[i][j - 1] + b[i][j - len(b[0]) + 1]
        #print(b2)
for i in range(len(b2)):
    for j in range(len(b2[i])):
        print(b2[i][j], end=' ')
    print()
 

Evoli

Новичок
Пользователь
Авг 1, 2020
5
1
3
Очень классная подсказка Джерри,реально работает ,я вот только проверил и офигел).Спасибо тебе большое,надо запомнить этот способ!
Этот enumerate создает объекты кортежи значит,я еще до них не дошел но очень интересно =))
 
  • Мне нравится
Реакции: Jerry

Форум IT Специалистов