簡體   English   中英

如何讓python程序檢查字符串中是否有字母

[英]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)

關鍵點:

  • 通過將字母存儲在一個集合而不是一個不允許快速(O(1))元素檢查的更一般的可迭代中來避免線性搜索
  • 循環輸入,而不是目標字母,因為字母表可能是一個有限的常量大小集合,並且允許甚至非常大的輸入,沒有線性搜索和過多的內存使用(將輸入放入集合而不是字母表中)
  • 通過使用生成器表達式避免不必要的列表創建(和浪費的內存)

這里有一些劣等的選擇。

通過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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM