Нужна помощь на Python
В: Панграмма - это предложение, которое содержит все буквы английского алфавита хотя бы один раз, например: Быстрая коричневая лиса перепрыгивает через ленивую собаку. Ваша задача здесь состоит в том, чтобы написать функцию для проверки предложения, чтобы увидеть, является ли это панграммой или нет.
Что у меня есть:
def isPangram(s):
alphabetList = 'abcdefghijklmnopqrstuvwxyz'
alphabetCount = 0
if len(s) < 26:
return False
else:
s = re.sub('[^a-zA-Z]','',s).lower()
for i in range(len(alphabetList)):
if alphabetList[i] in s:
alphabetCount = alphabetCount + 1
if alphabetCount == 26:
return True
else:
return False
Однако, когда я пробую пример s=["Быстрая коричневая лиса перепрыгивает через ленивую собаку"], результатом является Ложь, что неверно. Это должно быть True, потому что он содержал все 26 букв. Может кто-нибудь помочь мне исправить код? Большое спасибо!!!
5 ответов
Проблема в том, что вы передаете список строк вместо списка. Просто пройдите в "The quick brown fox jumps over the lazy dog"
без скобок и ваш код будет работать.
Ваш код также излишне сложен (и неправильно загружен):
if alphabetCount == 26:
return True
else:
return False
это слишком сложно - alphabetCount == 26
уже верно или ложно! Так что вы можете просто написать
return alphabetCount == 26
Кроме того, вы перебираете входную строку с индексной переменной. Это совершенно не нужно, просто переберите входную строку, например так:
for c in alphabetList:
if c in s:
alphabetCount += + 1
Сверху - и это вызвало ошибку сейчас, так как в противном случае код потерпел бы неудачу - проверка на len(s) < 26
совершенно лишнее, просто удали его.
Алфавит также уже встроен в Python, он называется string.ascii_lowercase
, Так что вам не нужно писать это самостоятельно!
При этом ваш алгоритм все еще очень медленный - вы повторяете более 26 раз! Почему бы просто не написать
import string
def isPangram(s):
return set(s.lower()) >= set(string.ascii_lowercase)
Проще сократить буквы в предложении до набора, а затем убедиться, что набор - это набор всех букв.
def isPangram(s):
alphabet = set('abcdefghijklmnopqrstuvwxyz')
s = re.sub('[^a-zA-Z]', '', s)
sentence = set(s.lower())
return sentence == alphabet
assert isPangram("The quick brown fox jumped over the lazy dog")
Я бы использовал наборы:
def isPangram(s):
alphabetset = set('abcdefghijklmnopqrstuvwxyz')
set_string = set(s.lower())
return set_string.issuperset(alphabetset)
Использование:
>>> isPangram('aabc')
False
>>> isPangram('aabcdefghijklmnopqrstuvwxyz')
True
>>> isPangram('aabcdefghijklmnopqrstuvwxyz J:L FSDJ f09823740235')
True
Пожалуйста, удалите оператор else после строки:
if alphabetCount == 26:
return True
так как он помещает код в условие else для самого i=0, потому что он принимает только один алфавитный счет.
import re
def isPangram(s):
alphabetList = 'abcdefghijklmnopqrstuvwxyz'
alphabetCount = 0
if len(s) < 26:
print('lenth is short')
return False
else:
s = re.sub('[^a-zA-Z]','',s).lower()
print(s)
for i in range(len(alphabetList)):
if alphabetList[i] in s:
print(alphabetList[i])
print("The string is pangram2")
alphabetCount = alphabetCount + 1
print(alphabetCount)
if alphabetCount >= 26:
print("The string is pangram")
return True
теперь код работает правильно
Если s - array() s=["Быстрая коричневая лиса перепрыгивает через ленивую собаку"], вы можете получить только len()=1, тогда if len(s) < 26: всегда возвращать False
def isPangram(s):
alphabetList = 'abcdefghijklmnopqrstuvwxyz'
alphabetCount = 0
if len(s) < 26:
print "False 1"
else:
s = re.sub('[^a-zA-Z]','',s).lower()
for i in range(len(alphabetList)):
if alphabetList[i] in s:
alphabetCount = alphabetCount + 1
if alphabetCount == 26:
print "True"
else:
print "False"
a=isPangram("The quick brown fox jumps over the lazy dog")