2016-11-18 61 views
4

我想吐出一個迴文列表,直到我給出的某個字母。如何在Python中使用for循環工作?

這是關於這部分:

def pyramid_palindrome(last_letter): 
    for letter in range(97,last_letter): 
     last_letter = last_letter - (last_letter-1) 
     print call_first_part_palindrome(last_letter) 
     print call_second_part_palindrome(last_letter) 

我要的是,要做到這一點:

a 
aba 
abcba 
abcdcba 
abcdedcba 
abcdefedbca 
abcdefgfedcba 
abcdefghgfedcba 
.... 

我想是這樣的:

「我會給最後一個字母作爲輸入,並且它將繼續迭代 迴文,直到最後一個字母被檢查。「

問題是,我無法設法逐個吐出迴文,像金字塔一樣遞增。有人能指引我朝着正確的方向嗎?

我說得對不對,當我說我需要在第一 功能使用for loop

這是我的全碼:

def pyramid_palindrome(last_letter): 
    for letter in range(97,last_letter): 
     last_letter = last_letter - (last_letter-1) 
     print call_first_part_palindrome(last_letter) 
     print call_second_part_palindrome(last_letter) 

def call_first_part_palindrome(last_letter): 

    letters_a_to_y = ""    

    for letter in range(97,last_letter): 
     letters_a_to_y += chr(letter) 

    return(letters_a_to_y) 

def call_second_part_palindrome(last_letter): 

    letters_y_to_a = "" 

    for letter in range(last_letter,96,-1): 
     letters_y_to_a += chr(letter) 

    return(letters_y_to_a) 

pyramid_palindrome(112) 

我想我靠近,但不能使點睛之筆。

+3

'last_letter = last_letter - (last_letter-1)'。這相當於'last_letter = 1',對嗎? –

回答

1

你的問題在呼喚你的兩個迴文功能,就當你是如何改變的值last_letter -

我試圖修改代碼儘可能少:

def pyramid_palindrome(last_letter): 
    for letter in range(97,last_letter): 
     print(call_first_part_palindrome(letter) + call_second_part_palindrome(letter-2)) 

這仍然是相同的:

def call_first_part_palindrome(last_letter): 

    letters_a_to_y = ""    

    for letter in range(97,last_letter): 
     letters_a_to_y += chr(letter) 

    return(letters_a_to_y) 

def call_second_part_palindrome(last_letter): 

    letters_y_to_a = "" 

    for letter in range(last_letter,96,-1): 
     letters_y_to_a += chr(letter) 

    return(letters_y_to_a) 

pyramid_palindrome(112) 

哪些輸出:

a 
aba 
abcba 
abcdcba 
abcdedcba 
abcdefedcba 
abcdefgfedcba 
abcdefghgfedcba 
abcdefghihgfedcba 
abcdefghijihgfedcba 
abcdefghijkjihgfedcba 
abcdefghijklkjihgfedcba 
abcdefghijklmlkjihgfedcba 
abcdefghijklmnmlkjihgfedcba 
+1

天才!謝謝你,我明白我現在在那裏做錯了什麼。謝謝你們! – Siyah

+0

無論如何@Siyah這不是完成此任務的最佳方式。其他答案提供了更有效的解決方案 –

3

你這整個邏輯可以使用串一起切片簡化string.ascii_lower爲:

import string 
alphs = string.ascii_lowercase # returns string of lower case characters 
last_letter = 'f' 

for i in range(len(alphs)): 
    print alphs[:i]+alphs[i::-1] 
    if alphs[i] == last_letter: # break the loop when `last_letter` is found 
     break 

這將產生輸出:

a 
aba 
abcba 
abcdcba 
abcdedcba 
abcdefedcba  

編輯:如果您不想導入string,你可能會得到一串小寫的cha通過使用racters:

alphs = ''.join(chr(i) for i in range(97,123)) 
+0

感謝隊友,但我更喜歡用for循環做它。你能幫助我嗎?我試圖儘可能少地使用導入功能。 – Siyah

+1

您的提案的問題在於,它不希望的信停止,如OP被要求 – Jalo

+0

如果通過對被範圍string.ascii_lowercase(97,last_letter)你不需要導入字符串 – Jalo

1

你的代碼比它需要的更復雜,並且不必要的工作從頭開始生成每個字母的字符串。

我不確定爲什麼你不想從string模塊中導入字母串,但是你可以輕鬆地生成一串字母,然後對其進行分片,以獲得構建每個迴文串所需的子串。下面的代碼工作在Python的2或3

def pyramid_palindrome(last_letter): 
    letters = ''.join([chr(i) for i in range(97, last_letter)]) 
    for i in range(last_letter - 97): 
     print(letters[:i] + letters[i::-1]) 

pyramid_palindrome(102) 

輸出

a 
aba 
abcba 
abcdcba 
abcdedcba 

另外,保持letters的名單和切片列表使用.join

def pyramid_palindrome(last_letter): 
    letters = [chr(i) for i in range(97, last_letter)] 
    for i in range(last_letter - 97): 
     print(''.join(letters[:i] + letters[i::-1])) 

添加兩個列表在理論上更快雖然在CPython中對小字符串進行了優化,所以除非字符串長度大於1000,否則您可能不會注意到其中的差異。 OTOH,在letters上調用.join一次可能比每個迴文調用它要好。


這是第一個版本的小變化。我們將所有的迴文保存到一個字符串列表中。然後,調用者可以將該字符串列表加入到一個字符串中,並用一個print調用打印出來。

def pyramid_palindrome(last_letter): 
    letters = [chr(i) for i in range(97, last_letter)] 
    return [''.join(letters[:i] + letters[i::-1]) 
     for i in range(last_letter - 97)] 

print('\n'.join(pyramid_palindrome(102)))