' ' in word == True
我正在编写一个程序,用于检查字符串是否为单词。为什么这样不起作用,有没有更好的方法来检查一个字符串没有空格/是单个单词。
==
的优先级高于 in
,所以你实际上在测试 word == True
。
>>> w = 'ab c'
>>> ' ' in w == True
1: False
>>> (' ' in w) == True
2: True
但你根本不需要== True
。 if
需要一个[可以评估为True或False的东西],而' ' in word
将被评估为true或false。 因此,if ' ' in word: ...
就可以了:
>>> ' ' in w
3: True
... == True
或 ... != False
,以及任何类似的变体。 - Stephenword==True
然后是' ' in True
,这没有意义。 - Rob Lourens使用if " " in word:
代替 if " " in word == True:
。
解释:
a < b < c
等同于(a < b) and (b < c)
。in
,都是一样的!' ' in w == True
相当于(' ' in w) and (w == True)
,这不是你想要的。<
和 ==
的工作方式就像你描述的那样,但我没有意识到 in
也是这样。我一直以为将它们组合起来会被视为 a in (b == c)
或 (a in b) == c
。要想看到它真正被解释为 Jukka 所说的那样,您可以尝试 'a' in 'abc' == 'abc'
。它是 True
,但如果按照我提出的其他两种方式进行解释,则会变成 False
。 - ArtOfWarfaret = s.split(" ")
if len(t) > 1:
print "several tokens"
import re
if re.search(r"\s", your_string):
print "several words"
s.split()
的" "
,因为默认情况下包括所有空格:https://docs.python.org/3/library/stdtypes.html#str.split - roganartuif mystring.find(' ') != -1:
print True
else:
print False
mystring.find(' ') != -1
是布尔值。 - SilentGhostprint mystring.find(' ') != -1
。 - Tim Pietzckerre.search('\s', word)
\t\n\r\f\v
与普通空格相邻),并引入了大量的开销。快速检查显示" " in word
为48.5ns
,而re.search("\s", word)
为873ns
,慢了一个数量级以上。正则表达式应仅用于真正更复杂的任务。 - Alex Povel你提到了一般的空格,而不仅仅是空格。我发现使用 isidentifier
可以解决问题。根据 W3 学校的说法:
如果一个字符串只包含字母数字(a-z)和(0-9)或下划线(_),则该字符串被认为是有效的标识符。有效的标识符不能以数字开头,也不能包含任何空格。
因此,如果这符合您的要求,isidentifier 是快速且易于使用的。
有人提到正则表达式的效率,我很好奇:
import timeit
setup='import re; rs="\s"; rc=re.compile(rs); s="applebananacanteloupe"'
stm1='re.search(rs,s)'
stm2='re.search(rc,s)'
stm3='" " in s'
stm4='s.isidentifier()'
timeit.repeat(stm1,setup)
# result: [0.9235025509842671, 0.8889087940042373, 0.8771460619755089, 0.8753634429886006, 1.173506731982343]
timeit.repeat(stm2,setup)
# results: [1.160843407997163, 1.1500899779784959, 1.1857644470001105, 1.1485740720236208, 1.2856045850203373]
# compiled slower than uncompiled? Hmm, I don't get regex...
timeit.repeat(stm3,setup)
# [0.039073383988579735, 0.03403249100665562, 0.03481135700712912, 0.034628107998287305, 0.03392893000273034]
timeit.repeat(stm4,setup)
# [0.08866660299827345, 0.09206177099258639, 0.08418851799797267, 0.08478381999884732, 0.09471498697530478]
所以,isidentifier
几乎和 in
一样快,比正则表达式快10倍。需要注意的是,从技术上讲,Python 对标识符的定义可能会发生变化 - 但如果确实发生了变化,您的代码也很可能需要进行一些改动。
stm2
改为stm2='rc.search(s)'
,你会注意到编译后的查询比未编译的查询更快,对于我的机器来说,编译后的版本比未编译的版本快2倍到4倍。 - undefinedword.strip(" ")
来从字符串中删除任何前导/尾随空格 - 在if
语句之前应该这样做。这样,如果有人输入像" test "
这样的输入,您的程序仍将正常工作。if " " in word:
将确定字符串是否包含任何空格。如果它不起作用,请提供更多信息。word = ' '
while True:
if ' ' in word:
word = raw_input("Please enter a single word: ")
else:
print "Thanks"
break
这是更符合惯用法的 Python 写法 - 不需要与 True 或 False 进行比较,只需使用表达式 ' ' in word
返回的值即可。
此外,对于如此小的代码片段,您不需要使用 pastebin - 只需将代码复制到您的帖子中,并使用小的 1 和 0 按钮使您的代码看起来像代码即可。
word = raw_input("Please enter a single word : ")
while True:
if " " in word:
word = raw_input("Please enter a single word : ")
else:
print "Thanks"
break
def word_in(s):
return " " not in s
expression == True
来测试真值。直接使用expression
就可以了! - Andrew Jaffe