2

各数字は、スペルアウトされた名前(0、1、2、3、4、5、6、7、8、9)に置き換える必要がありますが、新しいファイルのようにこれを取得し続けます:

zero0000000001one111111112222222222333three3333334444four4444455555five5555666666six666 

ここに私のプログラムがあります:

def numbers(fileName):
    #open the inputed file ,prompt for the file 
    inFile= open(fileName,'r') #this will open the function for writing and reading 
    outFile=open('converted.txt', 'w')
    for line in inFile:
        wordList=line.split()
        for word in wordList:
            if  word == '0':
                outFile.write("zero")
            else:
                outFile.write(word) 

            if word =="1":
                outFile.write("one")
            #else:
                #outFile.write(word)

            if word in wordList == "2":
                outFile.write("two")
            #else:
                #outFile.write(word)

            if word == ("3"):
                outFile.write("three")
            #else:
                #outFile.write(word)

            if word == ("4"):
                outFile.write("four")
            #else:
                #outFile.write(word)

            if word == ("5"):
                outFile.write("five")
            #else:
                #outFile.write(word)

            if word == ("6"):
                outFile.write("six")
            #else:
                #outFile.write(word)

            if word == ("7"):
                outFile.write(word)
            #else:
                #outFile.write(word)

            if word == ("8"):
                outFile,write(word)
            #else:
                #outFile.write(word)

            if word == ("9"):
                outFile.write(word)
            #else:
                #outFile.write(word)
    outFile.write(" ")
    outFile.write("\n")
    outFile.close()
    inFile.close()
4

8 に答える 8

2

これがあなたの問題です

    for word in wordList:
        if  word == '0':
            outFile.write("zero")
        else:
            outFile.write(word) 

「0」ではないすべての単語について、その単語が「else」部分にあるものを出力します。たとえば、後で印刷されたとしても、すべての 1 は1ではないために印刷されます。0one

私はこの問題を「アーリー デフォルト」問題と呼んでいます。この問題では、最初にチェックが失敗したときにデフォルト アクションを実行します。「早期デフォルト」の問題に悩まされないようにするには、デフォルト アクションの実行をできるだけ遅らせます。この場合、特別な単語 (== "0" から =="9" まで) のすべての可能な結果の大きな if... else if チェーンが必要であり、else if チェーンの最後の else は次のようになります。単語を書くデフォルトのアクション。

何かのようなもの

        if word == "0":
            outFile.write("zero")
        elif word == "1":
            outFile.write("one")
        elif word == "2":
            outFile.write("two")
...
        else:
            outFile.write(word)

ただし、より Pythonic な定式化は、リストを使用することです。

numberWords = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]

次に、for ループでこれを行います。

try:
    outFile.write(numberWords[int(word)]) # attempt to convert word to an int, then look in the list for its word
except ValueError: # if word was not a string version of an int
    outFile.write(word)

これにより、huuuuuuuuge if/elif/else チェーンを記述する必要がなくなり、保守も簡単になります (たとえば、すべての numberWords に対して一度に操作を実行できます。たとえば、大文字にしたり、ファイルからロードしたり、または. ..)

于 2013-04-19T02:26:58.710 に答える
0

名前のリストは int(word) でアクセスできるため、辞書を使用する必要はありません

def numbers(fileName):
    #open the inputed file ,prompt for the file 
    inFile= open(fileName,'r') #this will open the function for writing and reading 
    outFile=open('converted.txt', 'w')
    for line in inFile:
        wordList=line.split()
        names = ['zero', 'one', 'two', 'three', 'four',
                 'five', 'six', 'seven', 'eight', 'nine']
        [outFile.write(names[int(word)]) for word in wordList]
    outFile.write(" ")
    outFile.write("\n")
    outFile.close()
    inFile.close()
于 2013-04-19T03:28:35.533 に答える
0

数字を名前にマッピングするための辞書から始めて、数値の文字列表現を取得し、このマッピングで展開された文字列を返す関数を定義します。

もう少し柔軟にするために、出力から数字以外をフィルタリングするか保持するためのフラグ(寛容)と、呼び出し元が独自のカスタムセパレーターを提供できるようにする別のフラグが必要です。

    #!/usr/bin/python

    digit_names = {
        '0': 'zero',
        '1': 'one',
        '2': 'two',
        '3': 'three',
        '4': 'four',
        '5': 'five',
        '6': 'six',
        '7': 'seven',
        '8': 'eight',
        '9': 'nine'
        }

    def digit2name(num, tolerant=True, separator=''):
        '''Replace a number (string of digits) with an expansion into the
           mapping of each digit to its name.
        '''
        return separator.join([digit_names.get(x,(x,'')[tolerant]) for x in num])

        '''
        results = list()
        num = str(num)
        for digit in num:
            if tolerant:
                default=digit
            else:
                default=''
            results.append(digit_names.get(digit,digit))
        return separator.join(results)
        '''

    if __name__ == '__main__':
        import sys
        for each in sys.argv[1:]:
            print digit2name(each),
            print digit2name(each, False, '.')
            print

私はこれを、リスト内包表記を使用したワンライナーとして、またより読みやすく明示的なループ (私が好む) として行いました。

于 2013-04-19T02:52:04.807 に答える
0

あなたの if/else ブロックはかなりめちゃくちゃです。次のように、すべてのelseステートメントを削除elifし、最初の の後に使用する必要がありますif

    for word in wordList:
        if  word == '0':
            outFile.write("zero")
        elif word =="1":
            outFile.write("one")
        elif word == "2": # note that what you had here was very bad: if word in wordList == "2":
            outFile.write("two")
        elif word == "3":
            outFile.write("three")
        elif word == "4":
            outFile.write("four")
        elif word == "5":
            outFile.write("five")
        elif word == "6":
            outFile.write("six")
        elif word == "7":
            outFile.write("seven")
        elif word == "8":
            outFile,write("eight")
        elif word == "9":
            outFile.write("nine")
        else:
            # If you want to leave any other character unchanged, then you say:
            outFile.write(word)
于 2013-04-19T02:29:02.523 に答える
0

個々の if/else ステートメントを 1 つの if/elif/else ステートメントに変更します

if word == '1':
     outFile.write("one")
 elif word == '2':
      outFile.write("two")
 elif word == '3':
      outFile.write("three")
 else:
      outFile.write("four")
于 2013-04-19T02:29:06.870 に答える