Как использовать для цикла с логическим выражением? - PullRequest
0 голосов
/ 22 октября 2019

Мне нужно перебрать вложенные списки и проверить положение # в списке. Я использую координаты NWES (север, запад, восток, юг). Поэтому W должен возвращать False (потому что # находится в этой определенной позиции), E должно быть True и S также должно быть True. Я хочу перебрать каждую букву и получить логическое выражение для каждого из них. Проблема в том, что я получаю False для W, и он игнорирует E и S. Не знаю, есть ли проблема с отступами или что-то еще.

def something(can_mine, moves) -> bool:
    """"""
    for i in range(len(can_mine)):
        for j in range(len(can_mine[0])):
            for k in moves:

                if can_mine[j][-1] == '#' and k == 'E':
                    return False
                    #
                elif can_mine[j][0] == '#' and k == 'W':
                    return False
                    # N works
                elif can_mine[0][j] == '#' and k == 'N':
                    return False
                    # S works
                elif can_mine[-1][j] == '#' and k == 'S':
                    return False
                else:

                    return True


if __name__ == '__main__':
    print(something([['#', '.', '.', 'x'], ['.', '.', 'x', '.'], ['.', '.', 'X', 's'], ['.', '.', 'x', 'x']], 'WES' ))

What i need is something like that:
False
True
True
What I get is:
False (which is ok)
False (should be True)
False ( should be True)

1 Ответ

1 голос
/ 22 октября 2019

Ваш вопрос не так ясен, но, как я смог понять и прочитать ваш код, у меня есть несколько замечаний:

  1. вам не нужно 3 вложенных цикла for, но 2,один для moves и один для размера can_mine
  2. , вы не можете вернуться из функции с 1 логическим значением и ожидать, что она вернет 3, если вы нигде не сохраните их и вернете их, а не1 логическое значение
  3. ваш цикл moves должен быть первым, потому что он будет соответствовать вашему выводу -> если у вас будет m ходов, то ваш вывод будет иметь m логические значения
  4. заметьте, я инициализировал выходной вектор True вектором размера m, это с прямым контактом с тем фактом, что по умолчанию, если вы не вошли в одно из условий, вы возвращаете True

Я отредактировал код, чтобы он соответствовал указанному вами выводу. Пожалуйста, прочтите его и объясните себе, почему ваш код не работает так, как вы хотели.

Код:

def something(can_mine, moves):
    """"""
    m = len(can_mine[0])
    res = [True for i in range(len(moves))]
    for idx, k in enumerate(moves):
        for j in range(m):
            if can_mine[j][-1] == '#' and k == 'E':
                res[idx] = False
                #
            elif can_mine[j][0] == '#' and k == 'W':
                res[idx] = False
                # N works
            elif can_mine[0][j] == '#' and k == 'N':
                res[idx] = False
                # S works
            elif can_mine[-1][j] == '#' and k == 'S':
                res[idx] = False
    return res


if __name__ == '__main__':
    mine = [['#', '.', '.', 'f'], ['.', '.', 'N', '.'], ['.', '.', 'X', 's'], ['.', '.', 'j', 'X']]
    moves = 'WES'
    print(something(mine, 'WES'))

Выход:

[False, True, True]

...