按顺序搜索字符串中的扩展序列

时间:2019-01-14 06:42:40

标签: python sequence

有什么方法可以在一个命令或简短的代码段中按顺序(在输入中不连续)搜索字符串吗?

我将举例说明这个问题:

我以raw_input的形式从(+ or - or void)(number or void)X^2 (+ or -) (+ or - or void)X (+ or -) (+ or - or void)(number)生成了一个字符串,我想为(-+)aX^2 +- (-+)bX +- (+-)c分配一个标志,为c仅分配一个标志,并为通过定义搜索以输入b的任何顺序仅b ...仅ca,仅c(abc, cba, ac, cb, etc)等通过字符"x^2", "x"“数字”,并将每个顺序分配给一个标志...

可以不编写300多行包含ifelif吨的行吗? (我在第107行感到沮丧)。

我尝试了漫长的痛苦方式:

def sorting_abc():
    polinput = raw_input("insert a pol.: ")  # input as string
    a = 0
    b = 0
    c = 0
    temp = [] * 5

    splinput = polinput.split() #splitted string input
    lensplin = len(splinput)  #Length of splinput
    temp = splinput

    flag_1var = bool(lensplin == 1)
    flag_2var = bool(lensplin == 3)
    flag_3var = bool(lensplin == 5)
    flag_minusplus = bool(temp[1] == '-' and temp[3] == '+')
    flag_plusminus = bool(temp[1] == '+' and temp[3] == '-')
    flag_minusminus = bool(temp[1] == '-' and temp[3] == '-')
    flag_plusplus = bool(temp[1] == '+' and temp[3] == '+')
    flag_2var_minus = bool(splinput <= 3 and temp[1] == '-')
    flag_2var_plus = bool(splinput <= 3 and temp[1] == '+')

    if (flag_1var):
        p1 = tamp[0]
        p1i = p1.find('x^2')
        a = p1[:p1i:]
        if (a == ''):
            a = 1
        if (a == '-'):
            a = -1
        a = int(a)

    if (flag_2var):
        p1 = temp[0]
        p2 = temp[1]
        p3 = temp[2]
        if ('x^2' in p1):
            p1i = p1.find('x^2')
            a = p1[:p1i:]
            if (a == ''):
                a = 1
            if (a == '-'):
                a = -1
            c = p3
            if (p3 == '-'):
                c -= int(c)
        if ('x^2' in p3):
            p3i = p3.find('x^2')
            a = p3[:p3i:]
            if (a == ''):
                a = 1
            if (p2 == '-'):
                a -= int(a)
            c = p1

    if (flag_3var):
        p1 = temp[0]
        p2 = temp[1]
        p3 = temp[2]
        p4 = temp[3]
        p5 = temp[4]
        if ('x^2' in p1):
            p1i = p1.find('x^2')
            a = p1[:p1i:]
            if (a == ''):
                a = 1
            if (a == '-'):
                a = -1
            if ('x' in p3):
                p3i = p3.find('x')
                b = p3[:p3i:]
                if (b == ''):
                    b = 1
                if (p2 == '-'):
                    b -= int(b)
                c = p5
                if (p4 == '-'):
                    c -= int(c)
            if ('x' in p5):
                p5i = p5.find('x')
                b = p5[:p5i:]
                if (b == ''):
                    b = 1
                if (p4 == '-'):
                    b -= int(b)
                if (p2 == '-'):
                    c -= int(c)
                c = p3
        elif ('x^2' in p3):
            p3i = p3.find('x^2')
            a = p3[:p3i:]
            if (a == ''):

有没有机会大大缩短这一时间?

2 个答案:

答案 0 :(得分:2)

我会这样处理:

  1. 从输入字符串中删除所有空格。
  2. 将“全部大写”或“全部小写”应用于输入字符串。
  3. 使用+-符号(两者)作为分隔符,将您的字符串分成一个列表。为此,Google“使用正则表达式分割字符串”或选中此post
  4. 使用循环,对于列表中的每个元素,删除括号(如果存在)。
  5. 使用循环,对于列表中的每个元素,检查它们是否包含X^2X或不包含(根据之前的选择使用大写或小写X)。

如果需要,可以将4.和5.合并在同一循环中。

那应该可以用较短,灵活,可重用的代码为您提供所需的答案。希望对您有所帮助。

注意:在查看示例输入后进行的编辑。

答案 1 :(得分:1)

如果愿意,可以在regular expressions的帮助下完成此操作。这样做的好处是,您将知道输入是否立即匹配,并且在查询匹配对象时将知道所有元素是什么。

此处显示的解决方案依赖于re.match来反复查找方程式中的项。这样做的好处是,您可以将系数相加,以允许具有重复指数的项。添加对超出二次项的术语的支持也很容易。

结果将是一个字典,该字典由指数(常数项为0)作为键,总系数为该值。 此处显示的正则表达式依靠一种模式来匹配从this answerthis question的数字:

import re
from collections import defaultdict

string = '-12.5e-1 x^3 + -5 x^2 --0.5x +-0.75x^3 +6'

number = r'[-+]?(?:(?:\d*\.\d+)|(?:\d+\.?))(?:[Ee][+-]?\d+)?'
pattern = re.compile(fr'\s*([+-])\s*({number})\s*(x(\^\d+)?)?')

coefficients = defaultdict(int)
# prepend a + to avoid special-casing the first term
string = '+' + string.rstrip()
while string:
    match = pattern.match(string)
    if not match:
        raise ValueError(f'Invalid input starting with {string}')
    sign = 1 if match.group(1) == '+' else -1
    coefficient = sign * float(match.group(2))
    if match.group(3):
        exp = match.group(4)
        exp = 1 if exp is None else int(exp[1:])
    else:
        exp = 0
    coefficients[exp] += coefficient
    string = string[match.end():]

对于示例string,结果coefficients

defaultdict(<class 'int'>, {0: 6.0, 1: 0.5, 2: -5.0, 3: -2.0})

这是一个UDEOne链接:https://ideone.com/TwtY2e