【问题标题】:Python check if next element exist in listPython检查列表中是否存在下一个元素
【发布时间】:2015-09-12 16:28:42
【问题描述】:

我正在用 Python 做一些挑战。

我有以下代码:

def SimpleSymbols(str):
    letters = []
    results = []

    for i in range(len(str)):
        if str[i] != '=' and str[i] != '+':
            letters.append(str[i])

            if str[i-1] == '+' and str[i+1] == '+':
                results.append(str[i])

    return len(letters) == len(results)

https://repl.it/BH1s/1

如果我检查 print(SimpleSymbols('++d+===+c++==')) 一切顺利,但如果我检查 print(SimpleSymbols('++d+===+c++==+a'))

我收到此错误:

Traceback(最近一次调用最后一次):文件“python”,第 15 行,在 文件“python”,第 9 行,SimpleSymbols IndexError: string 索引超出范围

谁能解释一下为什么?

【问题讨论】:

  • Python 中的函数通常是lower_case,即simple_symbols,并且你不会重新定义像str 这样构造字符串对象的内置函数。也许def simple_symbols(symbols):。见PEP8 naming conventions
  • 您的代码为SimpleSymbols("c++") 返回True。是有意的吗?

标签: python


【解决方案1】:

您正在尝试访问索引str[i+1],这是在最后一次迭代中超出范围...

如果您必须使用它,请将循环限制为最多只能运行到len(str)-1。要处理这种情况:'++d+===+c++==+a' 您可以在循环之后添加检查 以验证最后一个元素不是 +(或将其添加到 if 条件中循环)。

此外,将变量命名为 str 是一种不好的做法,这是一个 python 内置函数!

【讨论】:

  • 如果我做 len-1 那么 SimpleSymbols('++d+===+c++==+a') 为真,在我的情况下为假,因为 isint 具有下一个元素 a +
  • 在这种情况下修改:if str[i-1] == '+' and str[i+1] == '+': 为:if str[i-1] == '+' and i < len(str)-2 and str[i+1] == '+':
【解决方案2】:

因为当你到达 str 的最后一个字符并且它是一个字母时,那么str[i+1] 就不存在了。

您需要将条件放在try except 块中以避免这种情况发生。 (当引发IndexError 时,您必须决定在except 中做什么)

def SimpleSymbols(str):
    letters = []
    results = []

    for i in range(len(str)):
        if str[i] != '=' and str[i] != '+':
            letters.append(str[i])
        try:
            if str[i-1] == '+' and str[i+1] == '+':
                results.append(str[i])
        except IndexError:
            do what needs to be done in this case.

    return len(letters) == len(results)

【讨论】:

  • 我不认为这是一个例外情况。可以用逻辑来解释。我知道EAFP,但如果还有其他IndexErrors,就很难确定该怎么做。
  • 同意,这是一个关于如何处理它的选择。在这里,try except 的优点是比改变逻辑更简单。
  • @PeterWood 这很特别,因为超过 95% 的时间你都不需要打扰,也可以str[i+1] 就好了
【解决方案3】:
def SimpleSymbols(str):
    letters = []
    results = []

    for i in range(len(str)):
        if str[i] != '=' and str[i] != '+':
            letters.append(str[i])

            if i < len(str)-1 and str[i-1] == '+' and str[i+1] == '+':
                results.append(str[i])

    return len(letters) == len(results)

print SimpleSymbols("=+b+a")

以这种方式编写代码, 一切都会好起来的。

【讨论】:

    【解决方案4】:

    您似乎正在寻找既不是+ 也不是= 的符号,并检查所有这些符号是否都在+ 之后和之前。

    第一个和最后一个符号是特殊情况,因为它们既不是前面也不是后面跟着任何东西,因此,如果它们既不是+ 也不是=,您的函数应该返回False

    由于在 python 中,some_string[-1] 返回字符串的最后一个字符,如果第一个字符既不是+ 也不是=,则循环不会中断。甚至返回 True 用于输入,例如 c++。但是,对于最后一个字符,您的代码会引发预期的 IndexError

    您可以:

    • 检查第一个或最后一个符号是否在('+', '=') 中,如果存在则返回False,因为它们不能在+ 之前或之后。然后你可以在内部字符串上运行你的循环:

      def SimpleSymbols(symbols):
          control = ('+', '=')
      
          if symbols[0] not in control or symbols[-1] not in control:
              return False
      
          for last_index, symbol in enumerate(symbols[1:-1]):
              next_index = last_index + 2
              if letter not in control:
                  if symbols[last_index] != '+' or symbols[next_index] != '+':
                      # Found a letter that is not enclosed in two '+'
                      return False
          return True
      
    • 使用正则表达式计算不在('+', '=') 中的符号和包含在两个+ 中的同一组中的符号的出现次数:

      import re
      
      def SimpleSymbols(symbols):
          simples = len(re.findall(r'[^+=]', symbols))
          enclosed = len(re.findall(r'\+[^+=]\+', symbols))
      
          return simples == enclosed
      

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2021-08-24
      相关资源
      最近更新 更多