有什么方法可以在一个命令或简短的代码段中按顺序(在输入中不连续)搜索字符串吗?
我将举例说明这个问题:
我以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
...仅c
和a
,仅c
和(abc, cba, ac, cb, etc)
等通过字符"x^2", "x"
“数字”,并将每个顺序分配给一个标志...
可以不编写300多行包含if
和elif
吨的行吗? (我在第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 == ''):
有没有机会大大缩短这一时间?
答案 0 :(得分:2)
我会这样处理:
+
或-
符号(两者)作为分隔符,将您的字符串分成一个列表。为此,Google“使用正则表达式分割字符串”或选中此post。X^2
,X
或不包含(根据之前的选择使用大写或小写X)。如果需要,可以将4.和5.合并在同一循环中。
那应该可以用较短,灵活,可重用的代码为您提供所需的答案。希望对您有所帮助。
注意:在查看示例输入后进行的编辑。
答案 1 :(得分:1)
如果愿意,可以在regular expressions的帮助下完成此操作。这样做的好处是,您将知道输入是否立即匹配,并且在查询匹配对象时将知道所有元素是什么。
此处显示的解决方案依赖于re.match
来反复查找方程式中的项。这样做的好处是,您可以将系数相加,以允许具有重复指数的项。添加对超出二次项的术语的支持也很容易。
结果将是一个字典,该字典由指数(常数项为0)作为键,总系数为该值。 此处显示的正则表达式依靠一种模式来匹配从this answer到this 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