2017-08-13 93 views
5

的這是我到目前爲止有:定義字母表任何字母串後來用來檢查一個字都有一定的字符

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是我學過的第一門語言,所以我可能犯了一個很大的錯誤。

+5

您是否嘗試過打印變量'alphabet'? – klutt

+0

@klutt是的,它總是打印「a」。如果你有一個'或'語句,我很確定python,它總是會做第一個'或',如果給出選項。我希望能夠掃描整個字母表以查看它是否可以找到一個字母,然後如果是,請查看它是否可以在字母旁找到另一個字母,然後再一次找到一個3個字母的單詞。 –

回答

0
words = [word for word in line.split() if len(word) == 3 and all(ch in ascii_lowercase for ch in word)] 
5

你有一些好的想法,但那種功能組成真正保留函數式語言(即語法這樣會在Haskell工作得很好!)

在Python,"a" or "b" or ...評估只是一個值,它不是你想要使用它的功能。所有的價值對他們來說都是「真實的」。所有字符串如果不是空的,則爲「truthy」(例如bool("a") == True,但是bool("") == False)。 or並不在這裏更具體改變任何東西,因爲第一個值是「truthy」,所以alphabet評估爲True(以"a"

letter_word_3然後嘗試做any("a" + "a" + "a"),這始終是True(因爲"a"是truthy)


你應該做的,而不是爲長度檢查每個單詞,然後檢查每一個字母,以確保它在"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) 
3

更合乎邏輯的是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個字母串並檢查「冰」是在那些,並固定它,如下所示:

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返回True如果x包含在sequence
  • a or b評估爲a如果a評估爲True,否則計算結果爲b
  • (非空)字符串的計算結果爲True
  • 兩個字符串可以+

串接不過,我建議你閱讀Python語言一個很好的介紹。

+1

請注意,'letter_word_3'變得非常長,然後一遍又一遍地檢查它的會員資格變得非常昂貴! (我知道*你*知道這一點,但對於OP ...) –

+0

是的,這個解決方案的規模很差。 'letter_word_n'的大小是n!因此在n> 13時使用此解決方案几乎是不可能的。 – klutt

+0

你說得對,我誤解了OP想要做什麼。我在頂部添加了第二個更合理的解決方案,但留下了舊的參考。 – fferri

5

有幾件事情是錯誤的。首先是alphabet總是被評估爲"a"

聲明中的or只是表示「如果以前的事情是錯誤的,請使用此代替。」由於"a"是truthy,它停在那裏。 Python的其他部分甚至沒有看到這封信。

接下來是anyany只是檢查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-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)) 

這將只允許小寫字母和數字(沒有首都)。

編輯:

要檢查ň的信件量,只需更改「{3}」你想在上面的代碼串任何長度的。例如

import re 
def is_eight_letters(word): 
    return bool(re.match(r"[a-zA-Z\d]{8}$", word)) 

上述內容將尋找允許大寫字母,小寫字母和數字的八字長字。

+0

N.B.那個'[a-zA-Z]'將允許大寫字母 –

+0

現在已經適用於所有情況。 @Adam Smith – ChristianFigueroa

3

最直接的實現,這是使用下面的功能:

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是好的,但也不會比使用內置快在字符串方法。另外,你不應該重新發明輪子。如果語言提供了適當的方法,則應該使用它。

相關問題