功能条件系列无法正常工作

时间:2016-11-29 01:25:02

标签: python

我有一个非常简单的程序来删除字符串中的第一级括号,但它似乎不起作用。我的逻辑似乎存在问题,但我无法发现它。

给定AB(CCDC)((EF)G)H之类的字符串,我应该返回ABCCDC(EF)GH。但由于某种原因,我的程序返回ABCCDC((EF))GH。这是程序:

def removeBrackets(string):
    level = 0
    list1 = list(string)
    poses = []
    for i in range(len(list1)):
        print level, list1[i]
        if level == 0 and list1[i] == '(':
            print "skipping!"
            level += 1
            continue
        elif level > 0 and list1[i] == '(':
            poses.append(list1[i])
            level += 1
        elif level == 1 and list1[i] == ')':
            print "skipping!"
            level -= 1
            continue
        elif level > 0 and list1[i] == ')':
            poses.append(list1[i])
            level -= 1
        print "adding " + list1[i] + "!"
        poses.append(list1[i])
    result = ""
    for i in poses:
        result += i
    return result

就打印skipping!adding!而言,它会按预期执行。但它仍然增加了两个括号,它不应该。请帮忙。

2 个答案:

答案 0 :(得分:0)

    elif level > 0 and list1[i] == '(':
        poses.append(list1[i])
        level += 1

    ...

    elif level > 0 and list1[i] == ')':
        poses.append(list1[i])
        level -= 1

    ...

    print "adding " + list1[i] + "!"
    poses.append(list1[i])

鉴于最后一个,前两个附加是多余的。它们会导致添加重复的括号集。

为了它的价值,你可以稍微简化你的功能。

  1. list1不是必需的。您可以使用与使用列表相同的方式处理字符串。

  2. 您可以直接使用string迭代string,而不是枚举for ch in string的索引。这摆脱了众多的list1[i]查找。 (如果您确实想知道每个角色的索引,请尝试for i, ch in enumerate(string)

  3. 如果您从级别字符检查中拆分字符检查,则会删除一些冗余。如果您看到括号,则无论如何都要修改level,因此最好只编写level += 1level -= 1一次。

  4. poses是变量的奇怪名称。 parts怎么样?

  5. 创建字符串结果的最后一个循环可以替换为''.join(parts)。这是一个看起来很滑稽但很常见的Python习语。

  6. 结果:

    def removeBrackets(string):
        level = 0
        parts = []
    
        for ch in string:
            print level, ch
    
            if ch == '(':
                level += 1
    
                if level == 1:
                    print "skipping!"
                    continue
            elif ch == ')':
                level -= 1
    
                if level == 0:
                    print "skipping!"
                    continue
    
            print "adding " + ch + "!"
            parts.append(ch)
    
        return ''.join(parts)
    

答案 1 :(得分:0)

poses.append(list1[i])
当迭代器位于'('或')时,for循环底部的这一行会添加第二个括号。而不是在1级或0级