【问题标题】:Cannot increment variable in Python无法在 Python 中增加变量
【发布时间】:2017-12-06 18:43:59
【问题描述】:

我正在学习如何编码,如果有任何意见,我将不胜感激。这是我为解决 Leetcode 上的一个简单问题而编写的代码。

问题是当第一次dict_ab[deck[-1]] == s[i+1]时,在执行deck.pop()之后,会迭代i到i+=2。然而这并没有发生,我自动只有 +=1。我做错了什么?我已经研究了一整天,无法弄清楚。

class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        a = ('(','{','[')
        b = (')','}',']')
        dict_ab = dict(zip(a,b))

        import collections

        if (len(s) % 2 == 1) or (len(s) == 0):
            return False
        else:
            deck = collections.deque()
            #deck.append(s[0])
            #print(s[0])
            #print(len(s))
            for i in range(0, len(s), 1):
                #print(i)
                deck.append(s[i])
                #print(deck)

                if dict_ab[deck[-1]] == s[i+1]:
                    deck.pop()
                    #print(deck)
                    i +=2
                elif dict_ab[deck[-1]] != s[i+1]:
                    deck.append(s[i])
                    i +=1


            if len(deck) > 0:
                return False

        return True


    s = ('()[]')
    result = Solution().isValid(s)
    print(result)

我看到的结果如下:

    KeyError                                  Traceback (most recent call last)
    <ipython-input-9-56d864c71658> in <module>()
     37         return True
     38 s = ('()[]')
    ---> 39 result = Solution().isValid(s)
     40 print(result)

    <ipython-input-9-56d864c71658> in isValid(self, s)
     23                 print(deck)
     24 
    ---> 25                 if dict_ab[deck[-1]] == s[i+1]:
     26                     deck.pop()
     27                     print(deck)

    KeyError: ')'

【问题讨论】:

  • 如果您添加通用的python 标签,将会有更多人看到您的问题。但是你需要解释你的程序应该做什么。看起来您正在尝试测试匹配的括号或类似的东西。你得到了KeyError,因为dict_ab 的键中没有右括号。您可能会发现 this answer 很有帮助。
  • 嗨@PM2Ring 感谢您的回复!我试图不透露太多信息,因为这是关于 Leetcode 的问题。但是,是的,您是正确的,问题是要找到匹配的括号。我已经解决了。我会在这里发布答案。我昨天在这里发布的原始解决方案没有正确执行叠瓦条件,因此执行起来是个问题。 (我在这里添加我更正的解决方案 - 但我不知道这是否可以 - 如果不是,请告知,我将删除问题和解决方案。

标签: python python-3.x


【解决方案1】:

这是一个 leetcode 问题。被评为“简单”。

给定一个仅包含字符 '(', ')', '{', '}', '[' 和 ']' 的字符串,确定输入字符串是否有效。 括号必须按正确的顺序关闭,“()”和“()[]{}”都有效,但“(]”和“([)]”无效。

== 下面是解决方案,如果您不想阅读,请停在这里 ==

class Solution:
def isValid(self, s):
    """
    :type s: str
    :rtype: bool
    """
    a = ('(','{','[')
    b = (')','}',']')
    dict_ab = dict(zip(a,b))

    import collections

    if (len(s) % 2 == 1) or (len(s) == 0):
        return False
    else:
        deck = collections.deque()
        for i in range(0, len(s), 1):
            if s[i] in a:
                deck.append(s[i])
            else:
                if s[i] in b:
                    if len(deck) == 0:
                        return False
                    else:
                        if s[i] == dict_ab[deck[-1]]:
                            deck.pop()
                        else:
                            return False



        if len(deck) > 0:
            return False

    return True

【讨论】:

  • 可以对此代码进行各种改进。不要将import 语句放在函数或类中,将它们放在脚本的顶部。但实际上,这里不需要双端队列:只从末尾弹出,因此可以使用普通列表。直接在字符串上循环而不是使用索引,例如for ch in s:。您可以使用elif: 而不是else:if 来减少一些嵌套。不要通过调用len 来测试列表是否为空:而不是if len(deck) == 0,只需执行if not deck
  • 谢谢@PM2Ring :) 确实,我也做了一些改进(就像你指出的那样)。感谢您的投入。
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多