Проверка списка Python

Итак, в списке мне нужно проверить, находится ли «z» в той же строке, что и выбранный регистр, и вернуть True, но если что-то находится в пути, например «x», он возвращает False. Я сделал код, но проблема в том, что если есть две буквы «z», а одна слева заблокирована «x», а другая нет, он возвращает False, но должен быть True. В остальных случаях работает нормально. Надеюсь, вы меня понимаете, я довольно плохо объясняю эти вещи.

def row(lst,i,j):
    c = 0
    if 'z' not in lst[i]:
        c += 1
    else:
        for n in range(0,len(lst[i])):
            if lst[i][n] == 'z' and n > j:
                for m in range(j,n):
                    if lst[i][m] == 'x':
                        c += 1
                    else:
                        c = 0
                break

            if lst[i][n] == 'z' and j > n:
                for m in range(n,j):
                    if lst[i][m] == 'x':
                        c += 1
                    else:
                        c = 0
                break

    if c > 0:
        return False
    elif c == 0:
        return True

Я действительно не знаю, что именно здесь «ломается», но это работает. Список, который я использую, таков:

lst = [['_','_','_','_','_'],['z','x','_','_','z'],['_','_','x','_','_']]

и случай, который я проверяю, это lst[1][2].

['_','x','_','_','z']

возвращает True, в строке есть 'z'.

['_','x','_','x','z']

возвращает False, z заблокирован

['z','x','_','x','z']

возвращает ложь

['z','x','_','_','z']

ПРОБЛЕМА: должен вернуть True


person bajotupie    schedule 14.11.2016    source источник
comment
Вы должны прочитать на break. И спросите, кто написал этот код, если вы этого не сделали.   -  person Andras Deak    schedule 14.11.2016
comment
Что означает, что «x» блокирует «z»?   -  person Bijay Gurung    schedule 14.11.2016
comment
@AndrasDeak Я написал это   -  person bajotupie    schedule 14.11.2016
comment
@BijayGurung означает, что в данном случае «x» находится между lst[1][2] и «z»   -  person bajotupie    schedule 14.11.2016
comment
Я думаю, что код довольно прост, но я всего лишь новичок и не могу определить проблему.   -  person bajotupie    schedule 14.11.2016


Ответы (1)


Есть две половины ряда для проверки. Тот, что до (i, j), и тот, что после (i, j).

Проблема в том, что вы ломаетесь, не дойдя до второй половины. Кроме того, я не знаю, что вы делаете с c.

В любом случае, одним из решений может быть следующее:

def check_row(lst, i, j):
    if 'z' not in lst[i]:
        return False

    for n in range(j, 0, -1):
        if lst[i][n] == 'z':
            return True
        elif lst[i][n] == 'x':
            break

    for n in range(j + 1, len(lst[i])):
        if lst[i][n] == 'z':
            return True
        elif lst[i][n] == 'x':
            break

    return False

Идея состоит в том, чтобы смотреть вдаль от целевого значения. Сначала делаем петлю от мишени до начала ряда, а затем петляем от мишени до конца ряда. В любой момент, если он встречает 'z', мы немедленно возвращаем True. Если он встречает 'x', мы прерываем поиск в этом направлении. Нас заблокировали.

Если мы доходим до конца, это означает, что мы не нашли 'z', поэтому мы возвращаем False.

Это, вероятно, можно было бы сделать намного короче, но эта базовая версия должна работать.

person Bijay Gurung    schedule 14.11.2016
comment
Большое спасибо, я действительно нашел решение, добавив еще один цикл for, но это вызвало у меня еще одну проблему, ха-ха. Что бы шло по линии, если бы не found_z?? Кроме того, мне нужно сделать это и для столбца, как бы вы проверили, есть ли «z» в столбце, поскольку вы не можете сделать, если «z» отсутствует в lst [i], как в строке. - person bajotupie; 14.11.2016
comment
Часть if not found_z не нужна. Я забыл удалить его. Нет простого способа пройти через колонны. Просто итерируйте как обычно. Посмотрите ответы здесь. - person Bijay Gurung; 14.11.2016