这是我到目前为止所拥有的:
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)]