Определение алфавита для любой буквенной строки для последующего использования, чтобы проверить, содержит ли слово определенное количество символов

Это то, что я до сих пор:

alphabet = "a" or "b" or "c" or "d" or "e" or "f" or \
           "g" or "h" or "i" or "j" or "k" or "l" or \
           "m" or "n" or "o" or "p" or "q" or "r" or \
           "s" or "t" or "u" or "v" or "w" or "x" or \
           "y" or "z"

letter_word_3 = any(alphabet + alphabet + alphabet)

print("Testing: ice")

if "ice" == letter_word_3:

    print("Worked!")

else:

    print("Didn't work")

print(letter_word_3) # just to see

Я хочу иметь возможность в конечном итоге отсканировать документ и заставить его выбрать 3-буквенные слова, но я не могу заставить эту часть работать. Я новичок в кодировании в целом, и Python - первый язык, который я выучил, поэтому я, вероятно, совершаю большую глупую ошибку.

5 ответов

Решение
words = [word for word in line.split() if len(word) == 3 and all(ch in ascii_lowercase for ch in word)]

Есть пара вещей неправильно. Прежде всего alphabet всегда оценивается в "a",

or в объявлении просто означает "если предыдущая вещь ложная, используйте это вместо". поскольку "a" правда, это останавливается там. Остальная часть письма даже не просматривается Python.

Далее идет any, any просто проверяет, если что-то в iterable правда. alphabet + alphabet + alphabet оценивается как "aaa", так letter_word_3 всегда возвращается True,

Когда вы проверяете, если "ice" == letter_word_3"Это оценивается как "ice" == True,

Чтобы проверить, состоит ли произвольное слово из трех букв, проще всего использовать следующее:

import re
def is_three_letters(word):
    return bool(re.match(r"[a-zA-Z]{3}$", word))

Вы можете использовать

is_three_letters("ice") # True
is_three_letters("ICE") # True
is_three_letters("four") # False
is_three_letters("to") # False
is_three_letters("111") # False (numbers not allowed)

Чтобы также разрешить номера, используйте

import re
def is_three_letters(word):
    return bool(re.match(r"[a-zA-Z\d]{3}$", word))

Это позволит вещам типа "h2o" также считаться трехбуквенным словом.

РЕДАКТИРОВАТЬ:

import re
def is_three_letters(word):
    return bool(re.match(r"[a-z]{3}$", word))

Приведенный выше код позволит использовать только строчные буквы (без цифр и прописных букв).

import re
def is_three_letters(word):
    return bool(re.match(r"[a-z\d]{3}$", word))

Это позволит только строчные буквы и цифры (без прописных букв).

РЕДАКТИРОВАТЬ:

Чтобы проверить количество букв n, просто измените "{3}" на любую длину в строках приведенного выше кода. например

import re
def is_eight_letters(word):
    return bool(re.match(r"[a-zA-Z\d]{8}$", word))

Выше будет искать восемь длинных слов, которые позволяют заглавные буквы, строчные буквы и цифры.

У вас есть несколько хороших идей, но такая композиция функций действительно зарезервирована для функциональных языков (то есть такой синтаксис будет хорошо работать в Haskell!)

В Python "a" or "b" or ... оценивает только одно значение, это не та функция, которую вы пытаетесь использовать. Все ценности имеют "правдивость" для них. Все строки являются "правдивыми", если они не пусты (например, bool("a") == True, но bool("") == False). or ничего не меняет здесь, так как первое значение является "правдивым", поэтому alphabet оценивает True (более конкретно "a",

letter_word_3 затем пытается сделать any("a" + "a" + "a"), который всегда True (поскольку "a" это правда)


Вместо этого вы ДОЛЖНЫ сделать проверку длины каждого слова, а затем проверить каждую букву, чтобы убедиться, что "abcdefghijklmnopqrtuvwxyz", Подождите секунду, вы заметили ошибку, которую я только что представил? Прочитайте эту строку еще раз. Я забыл "s"и вы тоже! К счастью, в stdlib Python эта строка где-то вам пригодится.

from string import ascii_lowercase  # a-z lowercase.

def is_three_letter_word(word):
    if len(word) == 3:
        if all(ch in ascii_lowercase for ch in word):
            return True
    return False

# or more concisely:
# def is_three_letter_word(word):
#     return len(word) == 3 and all(ch in ascii_lowercase for ch in word)

Самая простая реализация этого заключается в использовании следующей функции:

def is_three_letter_word(word):
    return len(word) == 3 and word.isalpha()

Так, например:

>>> is_three_letters("ice") # True
True
>>> is_three_letters("ICE") # True
True
>>> is_three_letters("four") # False
False
>>> is_three_letters("to") # False
False
>>> is_three_letters("111") # False (numbers not allowed)
False

С помощью all это хорошо, но не будет быстрее, чем использование встроенных строковых методов. Кроме того, вы не должны изобретать велосипед. Если язык предоставляет адекватный метод, вы должны использовать его.

Более логично, что letter_word_3 это функция, а не переменная. Вот как вы можете реализовать letter_word_3 и используйте его в своем коде:

alphabet = 'abcdefghijklmnopqrstuvwxyz'

def letter_word_3(word):
    return len(word) == 3 and all(x in alphabet for x in word)

print("Testing: ice")

if letter_word_3("ice"):
    print("Worked!")
else:
    print("Didn't work")

Я удалил печать последней строки letter_word_3 потому что не имеет смысла печатать объект функции.

Первоначально я неправильно предположил, что ваш код должен был сгенерировать все 3-буквенные строки и проверить, есть ли среди них "ice", и исправил это следующим образом:

alphabet = "abcdefghijklmnopqrstuvwxyz"

letter_word_3 = [a+b+c for a in alphabet for b in alphabet for c in alphabet]

print("Testing: ice")

if "ice" in letter_word_3: # it will search amongst 17000+ strings!
    print("Worked!")
else:
    print("Didn't work")

print(letter_word_3) # it will print 17000+ strings!

это, конечно, очень неэффективно, так что не делайте этого. Но так как это обсуждалось, я оставлю это здесь.

Некоторые полезные вещи, которые вы должны знать о Python:

  • строки являются последовательностями, поэтому их можно повторять (символ за символом)
  • символ - это сама строка
  • x in sequence возвращается True если x содержится в sequence
  • a or b оценивает a если a оценивает Trueв противном случае он оценивается как b
  • (непустая) строка оценивается как True
  • две строки могут быть объединены с +

Тем не менее, я рекомендую вам прочитать хорошее введение в язык Python.

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