Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何缩短if-elif条件用于解析_Python_String_Parsing_If Statement - Fatal编程技术网

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的方法。给我一分钟。