在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
我正在尝试迭代每个字母,同时考虑到空格,但我不确定如何'跳过'空格,这是弄乱我的功能?如果有人能指出我正确的方向,那将是有帮助的,谢谢。
答案 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
h
和1
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