1

str 形式のテキスト ブロックを含むテキストを 1 つの引数として取り、「対称」単語のソート済みリストを返す関数を作成する必要があります。対称単語は、すべての値 i について、単語の先頭からの文字 i の位置と、単語の末尾からの文字 i の位置が、アルファベットのそれぞれの端から等距離にある単語として定義されます。たとえば、bevy は対称的な単語です。b (単語の先頭から 1 番目の位置) はアルファベットの 2 番目の文字であり、y (単語の末尾から 1 番目の位置) はアルファベットの最後から 2 番目の文字です。e (単語の先頭から 2 桁) はアルファベットの 5 番目の文字であり、v (単語の末尾から 2 桁) はアルファベットの最後から 5 番目の文字です。

例えば:

>>> symmetrics("boy bread aloz bray")
['aloz','boy']
>>> symmetrics("There is a car and a book;")
['a']

解決策について私が考えることができるのはこれだけですが、間違っているため実行できません:

def symmetrics(text):
    func_char= ",.?!:'\/"
    for letter in text:
        if letter in func_char:
          text = text.replace(letter, ' ') 
    alpha1 = 'abcdefghijklmnopqrstuvwxyz'
    alpha2 = 'zyxwvutsrqponmlkjihgfedcba'
    sym = []
    for word in text.lower().split():
        n = range(0,len(word))
        if word[n] == word[len(word)-1-n]:
            sym.append(word)
        return sym

上記のコードは、alpha1 と alpha2 の位置を考慮していません。配置方法がわからないためです。誰でも私を助けることができますか?

4

4 に答える 4

1

for ループは次のように変更できます。

for word in text.lower().split():
    for n in range(0,len(word)//2):
        if alpha1.index(word[n]) != alpha2.index(word[len(word)-1-n]):
            break
    else:
        sym.append(word)
return sym
于 2013-04-19T04:27:34.573 に答える
0

最初にコードします。コードの下の議論。

import string

# get alphabet and reversed alphabet
try:
    # Python 2.x
    alpha1 = string.lowercase
except AttributeError:
    # Python 3.x and newer
    alpha1 = string.ascii_lowercase

alpha2 = alpha1[::-1]  # use slicing to reverse alpha1

# make a dictionary where the key, value pairs are symmetric
# for example symd['a'] == 'z', symd['b'] == 'y', and so on
_symd = dict(zip(alpha1, alpha2))

def is_symmetric_word(word):
    if not word:
        return False  # zero-length word is not symmetric
    i1 = 0
    i2 = len(word) - 1
    while True:
        if i1 >= i2:
            return True  # we have checked the whole string
        # get a pair of chars
        c1 = word[i1]
        c2 = word[i2]
        if _symd[c1] != c2:
            return False # the pair wasn't symmetric
        i1 += 1
        i2 -= 1

# note, added a space to list of chars to filter to a space
_filter_to_space = ",.?!:'\/ "
def _filter_ch(ch):
    if ch in _filter_to_space:
        return ' '  # return a space 
    elif ch in alpha1:
        return ch # it's an alphabet letter so return it
    else:
        # It's something we don't want.  Return empty string.
        return ''

def clean(text):
    return ''.join(_filter_ch(ch) for ch in text.lower())

def symmetrics(text):
    # filter text: keep only chars in the alphabet or spaces
    for word in clean(text).split():
        if is_symmetric_word(word):
            # use of yield makes this a generator.
            yield word

lst = list(symmetrics("The boy...is a yob."))
print(lst)  # prints: ['boy', 'a', 'yob']
  • アルファベットを 2 回入力する必要はありません。最初のものを逆にすることができます。

  • 各文字と対称文字を組み合わせた辞書を作成できます。これにより、特定の文字ペアが対称ペアであるかどうかを簡単にテストできます。この関数zip()は、2 つのシーケンスからペアを作成します。それらは同じ長さである必要がありますが、文字列と文字列の逆コピーを使用しているため、同じ長さになります。

  • 1 つのことを行う単純な関数を作成するのが最善なので、文字列が対称かどうかをチェックするだけの関数を作成します。長さゼロの文字列を指定すると、 が返されます。それ以外の場合は、文字列の最初の文字と最後の文字がFalse設定されます。文字が対称である限り文字を比較し、減少しながら増加します。2 つが出会うかすれ違う場合は、文字列全体を見たことがわかり、対称である必要があります。この場合、 を返します。対称でない文字のペアが見つかった場合は、 を返します。かどうかのチェックを行う必要がありますi1i2i1i2TrueFalsei1i2ループの先頭で遭遇または通過したため、文字が独自の対称文字であるかどうかを確認しようとしません。(キャラクターは両方同時に存在することはできないため、キャラクターが独自の対称キャラクターになることはありません! 'a')'z'

  • ここで、ジャンクを除外し、文字列を単語に分割し、各単語をテストするラッパーを作成します。選択した句読点文字をスペースに変換するだけでなく、予期しない文字 (承認された句読点文字、スペース、または文字以外のもの) を取り除きます。そうすれば、予期しないものが内部関数に到達しないことがわかります。ラッパーは「怠惰」です...リスト全体を構築してそれを返すのではなく、一度に1つの単語を生成するジェネレーターです。list()ジェネレーターの結果をリストに強制するために使用するのは簡単です。必要に応じて、この関数を簡単に変更して、リストを作成して返すだけにすることができます。

これについて質問がある場合は、質問してください。

編集: コードの元のバージョンは、句読点で正しいことをしませんでした。このバージョンはそうです。また、@heltonbiker が提案したように、Python に使用できるコピーがあるのに、なぜアルファベットを入力するのでしょうか? だから私もその変更をしました。

編集: @heltonbiker の変更により、Python バージョンへの依存関係が導入されました! try:問題を処理するために適切な/exceptブロックを残しました。Python 3.x では、小文字の ASCII アルファベットの名前がstring.ascii_lowercaseプレーンではなく に改善されたようですstring.lowercase

于 2013-04-19T04:47:41.023 に答える