【问题标题】:Palindrome comparison doesn't detect some cases回文比较未检测到某些情况
【发布时间】:2020-08-26 12:14:19
【问题描述】:

如果单词/行是回文,我想打印 True。 代码从文本文件中读取文本(使用 sys.argv[1])。 我不明白为什么它只检查第一行。

文本文件:

racecar
AddE
HmllpH
Was it a car or a cat I saw
Hannah
T can arise in context where language is played wit
Able was I ere I saw Elba
Doc note I dissent A fast never prevents a fatness I diet on cod

代码:

import sys
filename = sys.argv[1]

with open(filename, "r") as f:
    text = f.readline().strip().lower()

    while text:
        palindrome = True
        i = 0
        while i < len(text) / 2:
            if text[i] != text[len(text) - 1 - i]:
                palindrome = False
            i += 1
        if palindrome:
            print(True)
        text = f.readline().strip()

输出:

True

【问题讨论】:

  • 只有第一行是回文。无论哪种方式,您都可以使用text == text[::-1] 来检查是否回文
  • 不确定是否与此有关,但您可以循环 for text in f: (并在循环中剥离和降低)
  • 另外,您的代码似乎运行良好,但在 False 的情况下,您永远不会 print,除了第一个之外,所有代码都是错误的,因为您永远不会 lower 那些。

标签: python python-3.x algorithm palindrome


【解决方案1】:
  1. 为什么只打印第一行?

只有第一行是区分大小写的回文。

  1. 代码修复:

对你所见的一些解释:

2.1。循环for text in map(str.strip, f),意味着我们将遍历文件f 行并对每一行应用str.strip() 方法。

2.2。 text.upper() 将文字转为统一大写,方便比较。

2.3。 text_upper[::-1] 反转文本:奇怪的 [::-1] 索引表示法,意味着我们将所有元素向后移动一步(因此是 -1)。

import sys
filename = 'outfile.txt'

with open(filename, "r") as f:
    for text in map(str.strip, f):
        text_upper = text.upper()
        if text_upper == text_upper[::-1]:
            print(f'{text} is palindrom!')

【讨论】:

  • 完成后,您还可以将循环更改为for text in map(str.strip, f):
  • text = f.readline().strip().lower()替换最后一行不是更容易吗?在这种情况下,您甚至不需要 text_upper 变量。
【解决方案2】:

它确实检查所有行,但只有第一种情况返回 True,因为其他行没有 .lower()。您必须将最后一行更改为 text = f.readline().strip().lower()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 2012-08-17
    • 1970-01-01
    • 2015-08-03
    相关资源
    最近更新 更多