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



这是我到目前为止所拥有的:

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 ...的计算结果只有一个值,它不像你试图使用它那样是一个函数。所有价值观都有"真实性"。如果所有字符串不为空,则它们都是"真实的"(例如bool("a") == True,但bool("") == False(。or在这里不会改变任何东西,因为第一个值是"真实"的,所以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)

有几件事是错误的。首先,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-Zd]{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-zd]{3}$", word))

这将只允许小写字母和数字(没有大写字母(。

编辑:

要检查n个字母的数量,只需将"{3}"更改为上面代码中字符串中您想要的任何长度。

import re
def is_eight_letters(word):
return bool(re.match(r"[a-zA-Zd]{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很好,但不会比使用内置字符串方法更快。另外,你不应该重新发明轮子。如果语言提供了足够的方法,则应使用它。

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

但是,我建议您阅读有关Python语言的良好介绍。

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

最新更新