麻烦的交替字符串案例

时间:2017-06-14 03:56:21

标签: python string algorithm function loops

在CodeWars网站上进行练习,我需要帮助指向一个简单功能的正确方向:

  

写一个函数toWeirdCase(Ruby中的怪异)接受一个   string,并返回包含所有偶数索引字符的相同字符串   在每个单词的上部,每个单词中的所有奇数索引字符   较低的。刚才解释的索引是零基础,所以   零第索指数是偶数,因此该字符应该是上限   套管。

     

传入的字符串只包含字母字符和   空格('')。只有在有多个单词时才会出现空格。   单词将由单个空格('')分隔。

到目前为止我的代码是:

def to_weird_case(string):
    #TODO
    new_string = ''
    add = 0 
    for letter in range(len(string)):
        if string[letter] == ' ':
            add += 1
            new_string += string[letter]
            continue

        if (letter+add)%2 == 0:
            new_string += string[letter].upper()
        else:
            new_string += string[letter].lower()

    print("Returning: " + new_string)
    return new_string

我正在尝试迭代每个字母,同时考虑到空格,但我不确定如何'跳过'空格,这是弄乱我的功能?如果有人能指出我正确的方向,那将是有帮助的,谢谢。

8 个答案:

答案 0 :(得分:1)

只需创建一个计数器(一个整数变量),它将跟踪您是偶数还是奇数索引。如果遇到空格,计数器将不会增加,从而忽略它。

def to_weird_case(string):
    #TODO
    counter = 0
    new_string = ''
    add = 0 
    for letter in range(len(string)):
        if string[letter] == ' ':
            new_string += string[letter]
            continue

        # Increment counter only if not space
        counter = counter + 1
        if (counter)%2 == 0:
             new_string += string[letter].upper()
        else:
            new_string += string[letter].lower()

        print("Returning: " + new_string)
        return new_string

答案 1 :(得分:1)

您可以先使用str.split 拆分字符串来忽略这些空格,使用enumerate转换每个单词以选择偶数和奇数字符,然后使用{重新加入字符串空格上的{1}}:

str.join

如果您最终想要考虑空格,请直接使用def transform_word(s): return ''.join(x.upper() if i%2==0 else x.lower() for i, x in enumerate(s)) # ^------------^-> ternary operator for alternating def to_weird_case(string): return ' '.join(transform_word(s) for s in string.split()) print(to_weird_case('This is a lovely day')) # ThIs Is A LoVeLy DaY 函数:

transform_word

答案 2 :(得分:1)

print(transform_word('This is a lovely day'))
# ThIs iS A LoVeLy dAy

输出:回归:他们可能是一个不可思议的人

答案 3 :(得分:1)

尝试列表理解

def my_func(your_string):
    x = [ x.upper() if i%2==0 else x.lower() for i,x in enumerate(your_string)]
    return ''.join(x)

your_string = 'hello my name is lmurdock12'
print(my_func(your_string))

输出:

HeLlO My nAmE Is lMuRdOcK12

所以基本上在列表中理解的是我们使用enumerate()

x = [ x.upper() if i%2==0 else x.lower() for i,x in enumerate(your_string)]

enumerate采用一个iterable(string,list..etc)并逐个给出项目(i)其中我将是0,1,2,3 ......等等

因此,在列表解析中,我们检查从可迭代字符串i返回的项x对应的your_list。因此,在hello my name is lmurdock12中,0 h1 e,依此类推。如果i%2==0表示即使我们保留了x.upper(),我们会在列表中保留x.lower()

最后使用''.join(x)加入列表并根据需要返回。

注意:这可以在不使用index()进行枚举的情况下完成,但这会使我们的算法效率低下,因为我们每次都会搜索值并返回索引。使用枚举更好。

答案 4 :(得分:0)

如果您使用枚举功能

,则可以避开计数器
def to_weird_case(string):
    #TODO
    new_string = ''
    for i,letter in enumerate(string):
        if string[i] == ' ':
            new_string += string[i]
            continue

        if i%2 == 0:
            new_string += string[i].upper()
        else:
            new_string += string[i].lower()

    print("Returning: " + new_string)
    return new_string

答案 5 :(得分:0)

你的代码并不是真正的pythonesque。您的函数实际上只能有一行代码。这就是Python如此酷的原因。

def ToWeirdCase(word):
    return ''.join([char.upper() if pos%2==0 else char.lower() for pos, char in enumerate(word)])

答案 6 :(得分:0)

嗨,我今天早上遇到同样的问题,这是我的回答:

def to_weird_case(sentence):
counter = 0 # Counter set to zero, because of the even number fact at zero-ith.
weird_sentence = "" # This is the string we are going to return at the end.
for character in sentence:
    if character == " " and counter % 2 == 0: 
        weird_sentence += character 
        counter += 1    # Incrementation that will now make each characters before a space to be uppercased.
    elif character != " " and counter % 2 == 0:
        weird_sentence += character.upper() 
    else:
        weird_sentence += character.lower()
    counter += 1
return weird_sentence

我希望它可以帮助你。

答案 7 :(得分:0)

这是一个可行的解决方案。希望有帮助!

def to_weird_case(string)
  words = string.split(" ")

  words.map do |word|
    word.chars.map.with_index {|letter, idx| idx.even? ? letter.upcase : letter.downcase }.join("")
  end.join(" ")
end