Есть ли буква в этой позиции в списке списков?

Я пытаюсь написать функцию, которая определяет, присутствует ли буква в определенной строке и столбце в списке списков.

#Input:

lst2 = [['.', 'W', 'W', 'E', 'E'],
        ['.', '.', '.', '.', 'f'],
        ['A', 'A', 'A', '.', 'f']]

#Output: is_space_occupied(0, 1, lst2) should return True because 'W' is present on that spot 
        while is_space_occupied(1, 1, lst2) should return False because '.' is present on 
        that spot and not a letter.

Это код, который я до сих пор:

def letter_on_spot(row,col,lst):
A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
for row in lst:
    for col in lst:
        if col == A:
            return True
        else:
            return False

Редактировать: я получаю функцию возврата извне как ошибку для возврата True и не уверен, что моя функция работает правильно

4 ответа

Здесь есть две проблемы.

Во-первых, вы излишне зацикливаетесь; Вы предоставляете индексы для списка, поэтому вам нужно только проверить, содержится ли значение с этими индексами внутри строки A, Нет необходимости проходить через каждый элемент, просто чтобы проверить его; индексировать список lst,

Во-вторых, col == A всегда потерпит неудачу (если col = 'ABCD..yz'). Вы сравниваете их значения, когда должны проверять, A содержит col с in оператор.

Короче говоря, вы можете изменить свою функцию на:

def letter_on_spot(row,col,lst):
    A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    return lst[row][col] in A

и получить желаемый результат - True/False основанный на содержании данного индекса.

В идеале, необходимо выполнить некоторую проверку ошибок, чтобы теперь позволить индексам, которые приводят к IndexErrors; поиграть со списками len для этого примерно так:

def letter_on_spot(row,col,lst):
    A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    if row >= len(lst) or col >= len(lst[row]): 
        return False    
    return lst[row][col] in A

где, прежде чем пытаться получить доступ lstвы проверяете, приемлемы ли границы, проверяя длину списка lst и длина подсписка lst[row],

letter_on_spot(row, col, lst) принимает два целых числа (надеюсь) и список в качестве входных данных

давайте пройдемся по этому шагу:

for row in lst:

то же самое, что сказать для каждого меньшего списка в lst

for col in lst:

то же самое, что сказать для каждого меньшего списка в lst, так что это ваша первая проблема; мы хотим пройти через элементы строки, а не lst

if col == A:

предполагая, что мы исправили вышеуказанную проблему, мы проверяем, совпадает ли col с A, или мы проверяем, находится ли col в A?

мы можем получить доступ к элементам lst и проверить, является ли это буквой со следующим:

if lst[row][col] in A:
    return True
else:
    return False

Я не уверен, что именно не так с вашим кодом, но более короткая альтернатива заключается в следующем:

def letter_on_spot(row,col,lst):
    return lst2[row][col].isalpha()

Вы можете использовать индексы для доступа к элементам списка:

x = [10, 11, 12, 13]
x[1] # => 11

То же самое работает для списков списков:

lst2 = [['.', 'W', 'W', 'E', 'E'],
        ['.', '.', '.', '.', 'f'],
        ]
lst2[2]    # => ['A', 'A', 'A', '.', 'f']
lst2[2][1] # => 'A' 

Теперь все, что вам нужно сделать, это проверить, есть ли в символе символ. Python предоставляет str.isalpha() для этого:

lst2[0][1].isalpha() # => True
lst2[1][1].isalpha() # => False

Обратите внимание, что str.isalpha() также вернется True для строк с более чем одним символом (например, "hello".isalpha() возвращается True). Если это вызывает озабоченность, просто проверьте длину строки, которую вы можете получить, используя len(),

Другие вопросы по тегам