0

我对python很陌生。有人可以解释我如何操纵这样的字符串吗?

该函数接收三个输入:

  • complete_fmla:有一个带有数字和符号的字符串,但没有连字符 ( '-') 也没有空格。
  • partial_fmla: 有连字符和可能的一些数字或符号的组合,其中的数字和符号(连字符除外)与 complete_formula 中的位置相同。
  • 符号:一个字符

应该返回的输出是:

  • 如果符号不在完整公式中,或者符号已经在部分公式中,则函数应返回与输入部分公式相同的公式。
  • 如果符号在 complete_formula 而不是部分公式中,则函数应返回 partial_formula,其中符号替换符号所在位置的连字符,在 complete_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

作为 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

您可以检查此代码:

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 中的第二个参数是这样的 '----d---',其中 'd' 将是第三个参数('e')的相同索引,它将被替换为 'e '。

于 2012-10-30T17:56:08.037 回答
0

问候您可以尝试使用正则表达式,我认为它们会对您想要实现的目标有很大帮助,这里有链接

该文档中的一些示例:

>>> import re
>>> m = re.search('(?<=abc)def', 'abcdef')
>>> m.group(0)
'def'
于 2012-10-30T17:04:24.617 回答
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 回答