交替字符串大小写的问题



在CodeWars网站上完成练习,我需要帮助为一个简单的函数指明正确的方向:

将一个函数写到 WeirdCase(Ruby 中的 weirdcase),它接受 字符串,并返回包含所有偶数索引字符的相同字符串 每个单词中大写,每个单词中的所有奇数索引字符 小写。刚才解释的索引是从零开始的,所以 第 i 个零索引是偶数,因此该字符应为上限 套管。

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

到目前为止,我的代码是这样的:

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

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

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
if (counter)%2 == 0:
new_string += string[letter].upper()
else:
new_string += string[letter].lower()
# Increment counter after one place as 0th position is even
counter = counter + 1
print("Returning: " + new_string)
return new_string

to_weird_case("HELLO MY NAME IS abcdefghijk")

输出 : 返回: HeLlO mY nAmE iS aBcDeFgHiJk

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

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

您可以通过首先使用str.split拆分字符串来忽略空格,使用enumerate转换每个单词以选择偶数和奇数字符,然后使用空格上的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函数:

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

尝试列表理解

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)]

枚举采用可迭代对象(字符串,列表。等)并逐个给出项目(i)我将是0,1,2,3...等等

因此,在列表推导中,我们检查是否x从可迭代字符串your_list返回与该项目对应的i。因此,在hello my name is lmurdock12中,我会为h0,为e1等等。如果i%2==0这意味着即使我们保留x.upper()我们也会x.lower()保留在列表中。

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

注意:这可以通过使用index()在没有枚举的情况下完成,但这会使我们的算法效率低下,因为我们每次都搜索值和返回索引。最好使用枚举。

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

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

如果您使用枚举函数,则可以避免计数器

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

你的代码并不是真正的python式的。您的函数实际上只能有 1 行代码。这就是为什么Python如此酷的原因。

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

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

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

我希望它对你有所帮助。

最新更新