首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在修正字符串索引范围时,并不会测试所有代码。

在修正字符串索引范围时,并不会测试所有代码。
EN

Stack Overflow用户
提问于 2018-11-02 17:54:10
回答 2查看 59关注 0票数 0

下面的代码应该用来测试r和b是否是交替的。因此,"rbrbrb“的测试将被接受,而"rbbrbbr”则不会被接受。

然而,我的问题是,只测试def manufactoria()下的前两个

代码语言:javascript
复制
def manufactoria():
  test(alternating_colors, "")
  test(alternating_colors, "r")
  test(alternating_colors, "rb")
  test(alternating_colors, "rbrbrbr") 
  test(alternating_colors, "b") 
  test(alternating_colors, "brbr") 
  test(alternating_colors, "brbrbrbr") 

def alternating_colors(string):
    length = len(string)
    check = 0 
    if len(string) == 0 or len(string)==1:
        return True
    while check <= len(string)-1:
        if string[check]+string[check+1] == "rr" or string[check]+string[check+1] == "bb":
            return False
    check +=1
def test(fn, string):

    if fn(string):
        result = "accepted"
    else:
        result = "not accepted"


    print('The string "' + string + '" is ' + result)

manufactoria()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-02 18:15:40

以下是修正后的版本:

代码语言:javascript
复制
def alternating_colors(s):
    length=len(s)
    if length<2:
        return True
    for i in range(length-1):
        curr_slice = s[i:i+2]
        if curr_slice in ["rr", "bb"]:
            return False
    return True

这基本上是使用了普鲁恩回答的大部分内容。

一个更好的解决方案是使用正则表达式。这将发现任何r或b的重复:

代码语言:javascript
复制
import re
def alternating_colors(s):
    if re.search(r"r{2,}|b{2,}", s):
        return False
    return True
票数 1
EN

Stack Overflow用户

发布于 2018-11-02 18:10:52

它不会检查所有的代码,因为“超出范围的索引”异常会杀死程序。

您的索引超出了范围,因为您试图访问长度为2的字符串的位置2:"rb"有索引0和1,但是您试图检查string[1] + string[1+1]。您需要更早地停止检查循环一个索引,正如一位评论已经提到的那样。

如果您学习使用这些Python语言特性,您可以使这个程序更短、更容易维护:

  • <(小于运算符)
  • for语句(替换while和增量循环)
  • 字符串切片(而不是连接单个字符)
  • in操作符(而不是检查各个位置)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53123617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档