将字母表定义为任何字母字符串,以便稍后用于检查单词是否具有一定数量的字符
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 甚至没有看过其余的字母。
接下来是any
。 any
只是检查 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)]
这是我目前拥有的:
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
returnsTrue
如果x
包含在sequence
中
如果 a or b
的计算结果为a
,否则计算的结果为b
- 一个(非空)字符串的计算结果为
True
- 两个字符串可以用
+
连接起来
a
的计算结果为 True
,则 不过,我建议您阅读有关 Python 语言的精彩介绍。
有几处错误。首先 alphabet
总是 被评估为 "a"
。
声明中的 or
只是表示 "if the previous thing is false, use this instead." 因为 "a"
是真实的,它就到此为止了。 Python 甚至没有看过其余的字母。
接下来是any
。 any
只是检查 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)]