Есть ли буква в этой позиции в списке списков?
Я пытаюсь написать функцию, которая определяет, присутствует ли буква в определенной строке и столбце в списке списков.
#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
основанный на содержании данного индекса.
В идеале, необходимо выполнить некоторую проверку ошибок, чтобы теперь позволить индексам, которые приводят к IndexError
s; поиграть со списками 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()
,