2017-06-14 20 views
2

通過CodeWars網站上練習工作,我需要幫助被指出了正確的方向進行一個簡單的函數:麻煩與交替的字符串大小寫

寫一個函數toWeirdCase(weirdcase在Ruby中)接受一個 串,並返回相同的字符串,其中包含每個單詞上下文中的所有偶數索引字符 ,並且每個單詞 中的所有奇數索引字符下包含在內。剛纔解釋的索引是基於零的,所以012th零指數是偶數,因此這個字符應該是上面的 。

傳入的字符串將只包含字母字符和 空格('')。只有有多個單詞時,空格纔會出現。 單詞將被一個空格分隔('')。

我到目前爲止的代碼是這樣的:

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 

我想遍歷每個字母同時考慮到佔的空間,但我不確定如何「跳過」的空間和那是什麼在搞亂我的功能?如果有人可以指出我的方向,這將是有益的,謝謝。

+1

不錯的問題,有幾個很好的工具,你可以使用;),在你的情況下,我會使用枚舉,而不是計數器 –

+0

加號+1提及枚舉@DamianLattenero – void

回答

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 
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 
1

可以通過先分裂使用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功能:

​​
+1

摩西專家的聲音,總是出現在python問題。一如既往的好回答 –

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 

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

輸出:迴歸:我的名字是ABCDEFGHIJK

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 

所以基本上在這個列表理解發生的事情是,我們使用枚舉()

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

枚舉需要一個迭代(字符串,list..etc),並給出了項目一個一個地(I)我會是0,1,2,3 ...等等

因此,在列表理解中,我們檢查對應於從可迭代字符串your_list返回的項目x是否爲i。所以在hello my name is lmurdock12我會0h1e等等。如果i%2==0這意味着它甚至保持x.upper()否則我們在列表中保留x.lower()

最後使用''.join(x)加入列表並返回它,如果你想。

注:這可以做到人無使用index()枚舉,這將使我們的算法有點低效的,因爲我們的方式,我們有搜索價值和回報指數每次。使用枚舉更好。

+0

美麗的答案!我試圖理解列表理解,但我有點遠:/ –

+0

儘量學習和使用它。相信我,它可以非常有幫助。 Python中的神奇事物。 – void

+0

好的建議,謝謝,這就是爲什麼我的答案,上面的答案是關於循環的並行解決方案 –

0

你的代碼並不是真正的pythonesque。你的函數實際上只能有1行代碼。這就是爲什麼Python非常酷。

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

您需要返回一個字符串而不是列表,所以使用'join()'也是爲什麼你需要'和char! =「」'這一行?沒用。 – void

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 

我希望它可以幫助你。