Нужна помощь на 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")
Другие вопросы по тегам