【问题标题】:How to make this for loop in Python work?如何使 Python 中的这个 for 循环工作?
【发布时间】:2016-11-18 10:29:24
【问题描述】:

我想吐出一个回文列表,直到我给出某个字母。

关于这部分:

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)

我想我已经接近了,但无法画龙点睛。

【问题讨论】:

  • last_letter = last_letter - (last_letter-1)。这相当于last_letter = 1,对吧?

标签: python string python-2.7


【解决方案1】:

您的整个逻辑可以使用 字符串切片 以及 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))

【讨论】:

  • 谢谢伙计,但我更喜欢用 for 循环来做。你能帮我解决这个问题吗?我正在尝试使用尽可能少的导入函数。
  • 你的提议的问题是它没有像在 OP 中要求的那样在所需的字母中停止
  • 如果你用范围 (97, last_letter) 替换 string.ascii_lowercase 你不需要导入字符串
  • 编辑了答案以在不导入 string 的情况下执行此操作。但是,做string.ascii_lower 比显式创建字符串要好。此外,更新代码以考虑 last_letter
  • 试试print alphs[:i] + alphs[i::-1]
【解决方案2】:

您的问题是在调用您的两个回文函数时以及您如何更改 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

【讨论】:

  • 天才!谢谢伙计,我现在明白我在那里做错了什么。非常感谢!
  • 无论如何@Siyah 这不是完成这项任务的最佳方式。其他答案提供了更有效的解决方案
【解决方案3】:

您的代码比它需要的更复杂,并且从头开始生成每个字母字符串的不必要的工作。

我不确定您为什么不想从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)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多