[英]how do i make a python program check if a there is a letter from a string in a string
我試圖讓python程序檢查字符串中是否至少有一個字母?
import string
s = ('hello')
if string.ascii_lowercase in s:
print('yes')
else:
print('no')
它總是只打印否
好吧, string.ascii_lowercase
等於'abcdefghijklmnopqrstuvwxyz'
。 這看起來不像是hello
,對嗎?
你應該做的是ascii_lowercase
的字母並檢查它們中是否有任何字符串。
import string
s = ('hello')
if any([letter in s for letter in string.ascii_lowercase]):
print('yes')
else:
print('no')
評論中非常聰明的人指出,您可以刪除通常會創建列表的[ ]
括號,將列表理解轉換為稱為生成器的東西。 這樣可以防止需要檢查ascii_lowercase
每個字母,並使我們的代碼更快一些 - 就目前而言,生成整個列表然后進行檢查。 使用生成器,字母只會檢查到e
,就像'hello'
。
我能用這種方式剃掉整整一納秒 ! 盡管如此,對於大多數情況來說,直接瀏覽整個列表應該沒問題,並且肯定更簡單。
檢查的一種有效方法,如果一些字符串s
包含一些字母的任何字符:
alphabet = frozenset(string.ascii_lowercase)
any(letter in alphabet for letter in s)
關鍵點:
這里有一些劣等的選擇。
通過string.ascii_lowercase
線性搜索:
any(letter in string.ascii_lowercase for letter in s)
線性搜索string.ascii_lowercase
,以及無用的列表創建:
any([letter in string.ascii_lowercase for letter in s])
對輸入進行線性搜索,在輸入非常長並且不包含字母表中的任何字符的最壞情況下性能非常差:
any(letter in s for letter in string.ascii_lowercase)
目前您正在檢查整個字符串string.ascii_lowercase
是否在s
。
您必須檢查string.ascii_lowercase
每個字符。
天真的解決方案看起來像這樣:
>>> s = 'hello'
>>> for letter in string.ascii_lowercase:
... if letter in s:
... print('yes')
... break
... else:
... print('no')
...
yes
這里,只有在循環沒有被break
語句打破時, else
塊才會執行。
for
循環的簡寫是使用與generator-expression配對的any
內置函數:
>>> contained = any(letter in s for letter in string.ascii_lowercase)
>>> print('yes' if contained else 'no')
yes
最后,可以通過使用改進兩種實現的運行時set
從字符的s
,即s = set(s)
。 這將確保每一個in
檢查中固定的時間,而不是遍歷執行s
為每個被搜索的信。
編輯:這是另一個簡短的:
>>> if set(s).intersection(string.ascii_lowercase):
... print('yes')
... else:
... print('no')
...
yes
這使用了以下事實:在if
檢查中,空集(交集的可能結果)將被視為False
。
(它有一個輕微的缺點,即一旦發現一個共享的字母,交叉點的計算就不會停止。)
制作一set
每個字符串並檢查其交集的大小
def share_letter(s1, s2):
return bool(set(s1).intersection(s2))
這是另一種選擇:
import string
s = ('hello')
alpha = string.ascii_lowercase
if any(i in alpha for i in s):
print('yes')
else:
print('no')
或者更快:
import string
s = ('hello')
alpha = string.ascii_lowercase
for l in s:
if l in alpha:
print("yes")
break
print("no")
string.ascii_lowercase
是一個包含所有小寫字母的字符串,即abcdefghijklmnopqrstuvwxyz
。
因此,在if條件中, if string.ascii_lowercase in s
正在檢查字符串是否包含子字符串abcdefghijklmnopqrstuvwxyz
。
你可以試試這個,
if any(e in string.ascii_lowercase for e in s):
...
any
的表達式是生成器,因此它在第一次匹配時停止檢查。
另一種方法是,
if any(e.islower() for e in s):
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.