如何在Python中使这个for循环工作?

时间:2016-11-18 10:29:25

标签: python string python-2.7

我想吐出一份回文列表,直到我给出的某封信为止。

关于这一部分:

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 个答案:

答案 0 :(得分: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,可以使用以下命令获取小写字符的字符串:

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

答案 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

答案 2 :(得分: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,在.join上拨打letters一次可能比为每个回文调用它更好。

这是第一个版本的一个小变化。我们将所有的回文保存到字符串列表中。然后调用者可以将该字符串列表加入到一个字符串中,并通过一次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)))