将字母表定义为任何字母字符串,以便稍后用于检查单词是否具有一定数量的字符

Defining the alphabet to any letter string to then later use to check if a word has a certain amount of characters

这是我目前拥有的:

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 是我学习的第一门语言,所以我可能犯了一个很大的愚蠢错误。

你有一些好主意,但这种函数组合实际上是为函数式语言保留的(即像这样的语法在 Haskell 中工作得很好!)

在 Python 中,"a" or "b" or ... 的计算结果只有一个值,它不是您尝试使用的函数。所有值都有一个 "truthiness"。如果所有字符串不为空(例如 bool("a") == True,但 bool("") == False),则所有字符串都是 "truthy"。 or 在这里没有改变任何东西,因为第一个值是 "truthy",所以 alphabet 的计算结果是 True(更具体地说是 "a".

letter_word_3 然后尝试做 any("a" + "a" + "a"),这总是 True(因为 "a" 是真实的)


您应该做的是检查每个单词的长度,然后检查每个字母以确保它在 "abcdefghijklmnopqrtuvwxyz" 中。等一下,你注意到我刚才介绍的错误了吗?再次阅读该字符串。我忘记了一个 "s",你也可以!幸运的是 Python 的 stdlib 有这个字符串方便你使用。

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)

更符合逻辑的是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 returns True 如果 x 包含在 sequence
  • 中 如果 a 的计算结果为 True,则
  • a or b 的计算结果为 a,否则计算的结果为 b
  • 一个(非空)字符串的计算结果为 True
  • 两个字符串可以用+
  • 连接起来

不过,我建议您阅读有关 Python 语言的精彩介绍。

有几处错误。首先 alphabet 总是 被评估为 "a"

声明中的 or 只是表示 "if the previous thing is false, use this instead." 因为 "a" 是真实的,它就到此为止了。 Python 甚至没有看过其余的字母。

接下来是anyany 只是检查 iterable 中的内容是否为真。 alphabet + alphabet + alphabet 被评估为 "aaa",因此 letter_word_3 总是 returns 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))

以上将查找允许大写、小写和数字的八长单词。

最直接的实现是使用以下函数:

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 很好,但不会比使用内置字符串方法更快。另外,你不应该重新发明轮子。如果语言提供了足够的方法,你应该使用它。

words = [word for word in line.split() if len(word) == 3 and all(ch in ascii_lowercase for ch in word)]