0

私はpythonが初めてです。誰かがこのような文字列を操作する方法を説明できますか?

この関数は、次の 3 つの入力を受け取ります。

  • complete_fmla:数字と記号を含む文字列がありますが、ハイフン ( '-') もスペースもありません。
  • partial_fmla: ハイフンと、場合によってはいくつかの数字または記号の組み合わせがあり、その中の数字と記号 (ハイフン以外) は、complete_formula と同じ位置にあります。
  • 記号: 1文字

返される出力は次のとおりです。

  • 記号が完全な数式に含まれていない場合、または記号が既に部分的な数式に含まれている場合、関数は入力の partial_formula と同じ数式を返す必要があります。
  • 記号が完全な式にあり、部分式にない場合、関数は、完全な式のすべての記号の出現箇所で、記号が存在する位置のハイフンを記号に置き換えた部分式を返す必要があります。

基本的に、私は定義を使用しています:

def generate_next_fmla (complete_fmla, partial_fmla, symbol):

それらをリストに変換しますか? そして追加しますか?complete_fmlaまた、ハイフンを含む文字列のどこに追加するかを知るために、記号のインデックス番号を見つける必要がありますか??

4

5 に答える 5

1

シンプルなオンライン機能です

def generate_next_fmla(base, filt, char):
    return ''.join( c if c==char else filt[idx] for idx,c in enumerate(base)  )

核となる考え方は if else 節です:

c if c==char else filt[idx]

各文字と元の文字列内のその位置が与えられ、選択した文字と等しい場合は新しい文字列に配置し、そうでない場合はフィルター文字列から値を配置します

より冗長な方法で記述すると、次のようになります。

def generate_next_fmla (complete_fmla, partial_fmla, symbol):
    chars = ""
    for idx in range(len(complete_fmla)):
        c = complete_fmla[idx]
        if c==symbol:
            chars = chars + c
        else:
            chars = chars + partial_fmla[idx] 
    return chars

これは、more で数行にわたって記述された同じ関数です (文字列の太陽は悪い習慣であるため、実際には効率が大幅に低下します)。

于 2012-10-30T17:04:56.490 に答える
0

追加する必要のあるエッジケースがあることは間違いありませんが、これは単純なケースでは機能するはずです。

def generate_next_fmla (complete_fmla, partial_fmla, symbol):
    result = partial_fmla.strip().split(' ')[:] 
    for index, c in enumerate(complete_fmla):
        if c == symbol:
            result[index] = c
    return "".join(result)

リストに変換してから元に戻すと、変更が簡単になります。

編集:これはEnricoGiampieriの答えに似ていますが、リストがあります。

于 2012-10-30T17:39:36.793 に答える
0

Python の初心者として、おそらく開始するための最良のアプローチは、要件をコードに 1:1 でマッピングすることです。以下ができるだけ自明であることを願っています。

def generate_next_fmla (complete_fmla, partial_fmla, symbol):
    # test that complete_fmla does not contain '-'
    if '-' in complete_fmla:
        raise ValueError("comple_fmla contains '-'")
    # delete all spaces from partial_fmla if needed (this need was suggested
    # in the original question with some examples that contained spaces)
    partial_fmla = partial_fmla.replace(' ', '')
    # test if it is possible to test the "same positions" from both strings
    if len(complete_fmla) != len(partial_fmla):
        raise ValueError("complete_fmla does not have the same lenght as partial_fmla")
    # add other input checking as needed ...

    if symbol not in complete_fmla or symbol in partial_fmla:
        return partial_fmla

    # partial_fmla[i] = symbol wouldn't work in python
    # because strings are immutable, but it is possible to do this:
    # partial_fmla = partial_fmla[:i] + symbol + partial_fmla[i+1:]
    # and another approach is to start with an empty string
    result = ''
    for i in range(len(partial_fmla)):
        # for every character position in the formulas
        # if there is '-' in this position in the partial formula
        # and the symbol in this position in the complete formula
        if partial_fmla[i] == '-' and complete_fmla[i] == symbol:
            # then append the symbol to the result
            result += symbol
        else:
            # otherwise use the character from this positon in the partial formula
            result += partial_fmla[i]
    return result

print(generate_next_fmla ('abcdeeaa', '--------', 'd')) # ‘---d----’
print(generate_next_fmla ('abcdeeaa', '- - - x - - - - ', 'e')) # ‘---xee--’
print(generate_next_fmla ('abcdeeaa', 'x-------', 'a')) # ‘x-----aa’
print(generate_next_fmla ('abcdeeaa', 'x-----', 'a'))   # Exception
于 2012-10-30T17:48:15.130 に答える
0

こんにちは、正規表現を試してみてください。達成したいことを達成するのに大いに役立つと思います。ここにリンクがあります

そのドキュメント内のいくつかの例:

>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
于 2012-10-30T17:04:24.617 に答える
0

このコードを確認できます:

lst_fmla = []
def generate_next_fmla(s_str, fmla, c_char):
    i = 0
    for s in s_str:
        if c_char is s: lst_fmla.append(c_char)
        elif fmla[i] != '-': lst_fmla.append(fmla[i])
        else: lst_fmla.append('-')
        i = i + 1
    print(''.join(lst_fmla))
generate_next_fmla('abcdeeaa', '---d----', 'e')

たとえば、関数 generate_next_fmla の 2 番目の引数が '----d---' のような場合、この 'd' は 3 番目の引数 ('e') の同じインデックスであり、'e' に置き換えられます。 '。

于 2012-10-30T17:56:08.037 に答える