在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
中,我会为h
而0
,为e
而1
等等。如果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
我希望它对你有所帮助。