0

目前我正在做 Cordwarrior 中的奇怪案例问题。问题是编写一个接受字符串的函数 toWeirdCase(Ruby 中的奇怪大小写),并返回相同的字符串,每个单词中的所有偶数索引字符都大写,每个单词中的所有奇数索引字符都小写。刚刚解释的索引是从零开始的,所以第零索引是偶数,因此该字符应该是大写的。

我写了这个函数。它成功地交换了单个单词的大小写,但不适用于多个单词或一个句子,所以我想应用 swapcase 但它交换了句子的所有单词,这是不可取的。所以我可以不知道哪种条件可能适合这个::

   def to_weird_case(string):
    tot=""
    for i in range(len(string)):
        if i%2==0:
             tot+=string[i].upper()
        if i%2==1:
             tot+=string[i].lower()

    if string[i]==" " or i%2==1:
       to_weird_case(string[i:])
    return tot   

错误我得到了这种类型:

 toWeirdCase
 should return the correct value for a single word (8 of 8 Assertions)
 should return the correct value for multiple words
'ThIs iS A TeSt' should equal 'ThIs Is A TeSt'
'LoOkS LiKe yOu pAsSeD' should equal 'LoOkS LiKe YoU PaSsEd'
'ThIs iS ThE FiNaL TeSt cAsE' should equal 'ThIs Is ThE FiNaL TeSt CaSe'
'JuSt kIdDiNg' should equal 'JuSt KiDdInG'
'Ok fInE YoU ArE DoNe nOw' should equal 'Ok FiNe YoU ArE DoNe NoW'\

问题链接:https ://www.codewars.com/kata/52b757663a95b11b3d00062d/train/python

我想到了另一种方法来划分句子并将函数应用于每个单词。


   def swap(string):
    tot=""
    for i in range(len(string)):
        if i%2==0:
             tot+=string[i].upper()
        if i%2==1:
             tot+=string[i].lower()
    if i%2==0:
        swap(string[i])
    return tot

  def to_weird_case(string):
      new=""
      for j in string:
          print(swap(j))
  print(to_weird_case('ThIs iS A TeSt'))

但它使所有单词都大写。

4

2 回答 2

1
def to_weird_case(inp_str):
    #TODO
    string = ""
    Flag = True
    for ch in inp_str:
        if ch == " ":
            string += ch
            Flag = True
            continue
        if Flag:
            string += ch.upper()
        else:
            string += ch.lower()  
        Flag = not Flag
    return string

Flag 在 True 和 False 之间切换,如果出现空格,则 Flag 设置为 True,表示新单词正在开始,此外,如果遇到空格字符,则仅执行循环的以下部分

 if ch == " ":
            string += ch
            Flag = True
            continue

因为它有continue声明

于 2019-11-28T15:37:06.630 回答
1

你真的很亲近。当有空间时,你只需要一些特别的东西。

由于您的第一个功能适用于单个单词,因此我保留它来做真正的单词。

def to_weird_case(string): # actually your function
    tot=""
    for i in range(len(string)):
        if i%2==0:
             tot+=string[i].upper()
        if i%2==1:
             tot+=string[i].lower()

    if string[i]==" " or i%2==1:
       to_weird_case(string[i:])
    return tot   

def to_weird_case_words(string): # my contribution, so that It work with strings with spaces
    return ' '.join([to_weird_case(s) for s in string.split(' ')])

print(to_weird_case('this is a test'))
print(to_weird_case_words('this is a test'))

这是对我所做的事情的解释:首先,有 string.split(' ') 用单个单词创建一个列表。使用“这是一个测试”,输出是

['这是一个测验']。

然后我用列表理解循环它,并为每个单词应用你的函数。所以现在我们有了这个列表:

['这是一个测验']。

现在我们需要加入该列表,在每个单词之间放置空格字符。这是通过 ' '.join(list) 完成的。所以我们现在有了最终输出:

'这是一个测验'

还有其他方法可以做到,但我想使用你已经做过的。

于 2019-11-28T14:53:38.860 回答