Python 如何缩短if-elif条件用于解析
我正在尝试制作一个程序,在某些用户输入上执行某些任务,如递增或递减整数、向字符串添加字符等。Python 如何缩短if-elif条件用于解析,python,string,parsing,if-statement,Python,String,Parsing,If Statement,我正在尝试制作一个程序,在某些用户输入上执行某些任务,如递增或递减整数、向字符串添加字符等。 用户可以在同一行中发出多个命令 由于我使用的是原始输入,所以我不能(也不想)接受多行输入 是否可以缩短if-else条件,同时保持可读性 for i in test_str: if i == '[': a += 1 elif i == '(': b += 1 elif i == ']' and c > 0: c -= 1
用户可以在同一行中发出多个命令 由于我使用的是
原始输入
,所以我不能(也不想)接受多行输入
是否可以缩短if-else
条件,同时保持可读性
for i in test_str:
if i == '[':
a += 1
elif i == '(':
b += 1
elif i == ']' and c > 0:
c -= 1
elif i == ')'and d > 0:
d -= 1
elif c == 0 and d == 0:
ret += i
... # more elifs
elif也有可能类似于:
elif i == 'o':
if test_str[test_str.index(i)+1] == i: # next char is same
# handle
else:
# handle
我使用它进行解析。如果您想减少代码使用的行数,只需在一行上执行If-elif-else
语句即可
if i == '[':
a += 1
elif i == '(':
b += 1
elif i == ']' and c > 0:
c -= 1
elif i == ')'and d > 0:
d -= 1
elif c == 0 and d == 0:
ret += i
变成:
if i == '[': a += 1
elif i == '(': b += 1
elif i == ']' and c > 0: c -= 1
elif i == ')'and d > 0: d -= 1
elif c == 0 and d == 0: ret += i
但是你不应该这样做,你应该改变你正在使用的逻辑
首先,您应该使用一个函数,我还建议使用某种映射
例如:
d = {
'[' : ('add', a, 1),
'(' : ('add', b, 1),
']' : ('method', my_method, ['sample_arg1', 'sample_arg2'], {'sample_kwarg' : 'sample value'})}
def check_char(char, mapping):
mapper = d.get(char, None)
if mapper:
if mapper[0] == 'add':
mapper[1] += mapper[2]
if mapper[0] == 'subtract':
mapper[1] -= mapper[2]
if mapper[0] == 'method':
mapper[1](char, mapper[2], mapper[3])
# you get the idea....
def my_method(char, *args, **kwargs):
# deal with char....
我觉得它够短的。它仍然是可读的。好吧,如果你能扩展你正在共享的信息,它会有所帮助,因为它是这样的,不知道更多,我看不到任何真正的方法来减少这一点。建议根据i
的值将字典映射到应该做的事情。应用程序是什么?你是在写语法分析器还是括号匹配器?我想你可以简化你的算法,但是没有更多的上下文,这是不可能确定的。@eumiro抱歉,忘了提一下,但是还有更多的elif
语句我明白了,我不打算为你写代码,但您应该使用我的示例作为开始,为代码编写适当的函数。进一步的建议是将其全部封装在一个类中,并为您可能拥有的每种类型的组合/操作提供一个函数,将每种情况映射到其最通用的形式,然后您的接口将只是向您的函数中提供一个流、字符串或字符,剩下的就由它来完成。:)你能告诉我如何使用映射而不是代码来处理多个ELIF吗?这只是一个开始,就像一个可以使用什么的想法。你可以将方法/函数映射到一个字典,这样你就可以拥有d={']':my_method}
,然后在你的check_char
中,你可以通过执行mapper=d.get(char,None)将你的输入发送到一个函数
如果mapper是一个函数,您只需调用它:mapper(char)
(这类似于执行my_method(char)
),然后该函数将处理输入。-添加到我的回答中感谢mapper的想法。我知道单行if语句,但它们不是我想要的。但我得到了我似乎需要的东西。但是我没有看到任何更新:)刷新页面?-我将为您添加一个奖金,使用args的方法。给我一分钟。