如何使if-elif条件更短以便解析

时间:2013-02-13 10:24:01

标签: python string parsing if-statement

我正在尝试制作一个程序,在某些用户输入上执行某些任务,例如递增或递减整数,将字符串添加到字符串等。
用户可以在同一行中提供多个命令。

当我使用raw_input时,我不能(也不想)采用多行输入。

是否可以缩短if-elif-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

我正在使用它进行解析。

1 个答案:

答案 0 :(得分:0)

如果您想减少代码使用的行数,您只需在一行上执行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....