Как найти соседние элементы в многомерном списке в Python?

Здесь у меня есть многомерный список на Python. Предположим, я беру ввод, как мне найти количество соседних элементов этого ввода, которые являются алфавитами, отличными от него самого? Если есть несколько индексов, по которым размещен элемент, то мы должны вывести максимум из всех возможных. Например, количество соседних элементов, равных ‘R’, равно 2.

z=input()
#suppose c="R"
#print the number of equal and adjacent elements, for c="R" it is 2
l=[['G', '.', 'B', 'C'], ['A', '.', 'R', 'Z'], ['.', '.', 'R', 'B']]



#G.BC
#A.RZ
#..RB

Вот как я это пробовал.

from collections import OrderedDict
x,y,z=input().split()
l=[]
c=[]
x,y=int(x),int(y)

def f(e):
    ls=[]
    a=e[0]
    b=e[1]
    for i in range(int(x)):
        for j in range(int(y)):
            t=l[i][j]
            if i==a and t!=z and t!='.':
                if j==b-1 or j==b+1:
                    ls.append
            if j==b and t!=z and t!='.':
                if i==a-1 or i==a+1:
                    ls.append
    ls=list(OrderedDict.fromkeys(ls))
    
    return ls
                

for i in range (0,int(x)):
    s=""
    s=input()
    sl=list(s)
    for j in range(int(y)):
        if z==sl[j]:
            c.append([i,j])
    l.append(sl)
d=0
for i in range(len(c)):
    m=f(c[i])
    d=max(d,len(m))
print(d)

Здесь функция f используется для создания списка элементов, удовлетворяющих условиям. z — это символ, вводимый пользователем, а x, y — размерность списка.

   'OO
    WW
    WW'
    #Here if the input is W, then the answer should be one.
    
   'G.B.
    .RR.
    TTT.'
    #Here if input is R, then the answer is 2

1 ответ
1

  • Честно говоря, я не могу точно подтвердить, чего вы на самом деле хотите. Поскольку вы спрашиваете Code Review, Я предполагаю, что вы хотите, чтобы кто-то просмотрел ваш код и дал совет.

совет

  1. Всегда используйте осмысленное имя для переменной и имени функции, не используйте что-то вроде a, b, x, y, f. Они сбивают с толку людей, читающих ваш код. Когда вы прочитаете код и последуете советам, вы их найдете. Это нормально использовать i, j в каком-то простом цикле. Поэтому я заменил большинство из них, некоторые из них могут быть не совсем подходящими.
  2. Нет необходимости записывать соседние элементы в ls(результат), просто +1 к результату f(find_adjacent_elements).
  3. Также нет необходимости проверять все l(карта), просто проверьте z(base_char) вверх вниз влево вправо 4 направления. Это может ускорить ваш код, особенно если размер карты огромен.
  4. Пожалуйста, прочитайте PEP-8, это может сделать ваш код более читабельным. Такие как a=e[0] должно быть a = e[0].
  5. Я исправил еще несколько мелких проблем, проверьте, чем отличается мой код от вашего.

фиксированный код:

def find_adjacent_elements(base_pos):
    result = 0
    directions = [[1,0],[-1,0],[0,1],[0,-1]]
    for direction in directions:
        try:
            adjacent_element = map[base_pos[0] + direction[0]][base_pos[1] + direction[1]]
            if adjacent_element != base_char and adjacent_element != ".":
                result += 1
        except IndexError:
            pass
    return result
                
print("please input the columns,rows and base character")
columns,rows,base_char = input().split()
map = []
base_char_pos = []
columns,rows = int(columns),int(rows)
for i in range(columns):
    map_line = list(input())
    for j in range(rows):
        if base_char == map_line[j]:
            base_char_pos.append([i,j])
    map.append(map_line)
ans = 0
for i in range(len(base_char_pos)):
    ans = max(ans,find_adjacent_elements(base_char_pos[i]))
print(ans)

контрольная работа:

please input the columns,rows and base character
4 4 R
..A.
.BRC
.DRE
..F.

3

please input the columns,rows and base character
2 2 R
R.
.R

0

please input the columns,rows and base character
3 2 W
OO
WW
WW

1

please input the columns,rows and base character
3 4 R
G.B.
.RR.
TTT.

2

  • Большое спасибо за ваш совет, я учту эти моменты. Я понял, как вы просто проверили позиции вокруг базового персонажа, что сделало его более эффективным. Спасибо, что нашли время и помогли мне!

    — SVM

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *