2

私はオンラインでいくつかのチュートリアルを行っています...そして私は演習で立ち往生しています:postalValidate(S)Sが有効な郵便番号を表すかどうかを最初にチェックする関数を定義します。注:文字列、リスト、ifステートメント、ループ、および変数や関数などの他の基本的な構造で解決することになっています。

まず、すべてのスペースを削除します。余りは、が文字(小文字または大文字)で、が数字の形式L#L#L#である必要があります。L#

Sが有効な郵便番号でない場合は、ブール値を返しFalseます。が有効な場合は、同じ郵便番号のバージョンを、それぞれが大文字Sの素敵な形式で返します。L#L#L#L

これらの演習用のコードを作成しましたが、採点者はそれが間違っていると言いましたが、私もそれを投稿します。

def postalValidate(S):
   while " " in S:
     S.remove(" ")
   for i in range(1,6,2):
     S.isdigit(S[i])
   for j in range(0,5,2):
     S.upper(S[j]
     S.isalpha(S[j])
   return True
4

9 に答える 9

4

これは明らかに正規表現の仕事ですが、演習で正規表現を使用する必要があるかどうかはわかりません...

念のため、これを回答として投稿しています。それ以外の場合は、お知らせください...

#/usr/bin/evn python

import re
zipCode = re.compile(r"\s*(\w\d\s*){3}\s*")

if __name__ == "__main__":
    samples = [
        "           44F 4 F", #Invalid
        "  L0L0L0    ", #Valid
        "  L0  L0  L0    ", #Valid
    ]

    for sample in samples:
        if zipCode.match(sample):
            print "The string %s is a valid zipCode (nice and clean: %s)" % (sample, sample.replace(" ", "").upper())
        else:
            print "The string %s is NOT a valid zipCode" % sample

編集:

正規表現は使えないので、考え方を変えてみてはいかがでしょうか... 文字が有効な郵便番号に属しているかどうかを確認する代わりに、その逆を行うことをお勧めします。属していないかどうかを確認してください。有効な郵便番号で、間違った (または間違った) 文字を検出するとすぐに False を返します。

def postalValidate(S):
    S = S.upper().replace(" ", "")
    if len(S) == 6:
        for i in range(len(S)):
            if i % 2 == 0:
                #Even index (0, 2, 4, 6...) , has to be 'letter'
                if not(S[i].isalpha()):
                    return False 
            else:
                #Odd index (1, 3, 5, 7...), must be 'number'
                if not(S[i].isdigit()):
                    return False

    else:
        #You can save some cpu ticks here... at this point, the string has to be of length 6 or you know it's not a zip
        return False
    return S

return ステートメントは現在の関数の実行を停止するため、チェックする文字列に何か「問題がある」ことに気付いたらすぐに False を返すことができます (無効であることがわかったら、チェックを続けても意味がありませんよね?)

于 2012-08-06T16:59:04.490 に答える
2

私はたまたま、同じコーディング制約で同じチュートリアルに取り組んでいました。何時間も頭を掻いた後:

def postalValidate(S):
   S = S.replace(" ","") 
   if len(S) != 6 or S.isalpha() or S.isdigit(): 
      return False  
   if not S[0:5:2].isalpha(): 
      return False  
   if not S[1:6:2].isdigit(): 
      return False 
   return S.upper()  
于 2012-10-22T06:28:11.717 に答える
2
import re
def postalValid(S):
    spaceless = S.replace(' ','')
    if not re.match(r"[a-zA-Z][0-9]+[a-zA-Z][0-9]+[a-zA-Z][0-9]+",spaceless):
       return False
    return spaceless.upper()

正規表現 (python re モジュール) は、文字列内のパターンを探します。

[a-zA-Z]正確に 1 文字に一致します

[0-9]+1 つまたは複数の数字 (つまり、0,9,99,9999) に一致します ... 1 桁だけが必要な場合は、プラス演算子を取り除き、 正確に 1 桁に一致[0-9]+するようにします[0-9]

so [a-zA-Z][0-9]+[a-zA-Z][0-9]+[a-zA-Z][0-9]+は、1 つの文字の後に数字 (複数桁の数字でもかまいません) が続き、その後に文字が続き、別の数字が続き、さらに別の文字が続き、数字で終わるものと一致します。

正規表現を使用できない場合は、次のことができます

def postalValid(S):
    no_spaces = S.replace(" ","")
    if len(no_spaces ) > 6: return false
    for i in range(6):
        if i%2:
           if not no_spaces[i].isdigit():return False
        else:
           if not no_spaces[i].isalpha():return False

     return no_spaces.upper() #True

ただし、各数値が 1 桁のみであることを前提としています

于 2012-08-06T17:00:24.847 に答える
1

これは、演習関数を記述して検証するための比較的簡単な方法です。最初の空白文字は文字列引数から削除され、プロセスでそのローカル コピーが作成されます。次に、やや長い論理式の各部分式が True と評価されるかどうかに応じて、ブール値が返されます。

def postalValidate(s):
    s = s.replace(" ", "")
    return(len(s) == 6 and
           all(s[i].isdigit() for i in range(1, 6, 2)) and
           all(s[i].isalpha() for i in range(0, 5, 2)))

if __name__ == '__main__':
    for testcase in 'a1b2c3', '980222', 'A456C7':
        print('postalValidate({!r}) -> {}'.format(testcase,
                                                  postalValidate(testcase)))

出力:

postalValidate('a1b2c3') -> True
postalValidate('980222') -> False
postalValidate('A456C7') -> False
于 2012-08-06T17:42:19.863 に答える
1

おそらく S は文字列なので、それについては説明しません。まず第一に、isdigit と isalpha を間違って呼び出しています。第二に、有効な郵便番号でない場合に false を返すことはありません。 return Trueコードで何が起こっても、常に True を返します。これがあなたがやろうとしていると私が思うことです:

def postal_validate(s):
    s = s.replace(' ', '')
    for i in range(1,6,2):
        if (not s[i].isdigit()):
            return False
    for i in range(0,5,2):
        if (not s[i].isalpha()):
           return False
    return s.upper()

もちろん、私は間違っているかもしれません。

于 2012-08-06T16:59:56.997 に答える
1
import re

regex ="[a-zA-Z]+\d+[a-zA-Z]+\d+[a-zA-Z]+\d+"

def ispostal(v):
    v = re.sub('\s+', '', v)
    if re.match(regex, v):
        return v.upper()
    else:
        return False
于 2012-08-06T17:00:21.003 に答える
1

正確なコードを投稿しているのではなく、アルゴリズムだけを投稿しています。インラインコメントを読んでください。(注: 以下は python コードではありません..)

def postalValidate(S):
   while " " in S:
     S.remove(" ") #Are you sure this will work? Strings are immutable.. You need to assign back to `S`

   for i in range(1,6,2):
     if s[i] is not a digit:
         return False
   for j in range(0,5,2):
     S.upper(S[j]) # you need to assign to S[j] again, plus use ".upper()"
     if S[j] is not alpha:
         return False
   return s.upper() #simple .upper() will do the job.

を使用できればre、次のように簡単になります。

if re.search(r'^([a-zA-Z][0-9]){3}$', s.strip()):
    return s.strip().upper()
return False
于 2012-08-06T17:03:58.773 に答える