【问题标题】:<function>(str1, str2) calling them separately<function>(str1, str2) 分别调用它们
【发布时间】:2013-11-13 19:34:37
【问题描述】:

首先,这是 IS 作业,所以我不期待任何直接的答案。我需要取两个由函数(semordnilap(str1, str2))定义的字符串,并且当一个字符串反转时我需要查看它们是否相等。我想知道我是否可以使用semordnilap(str1[0:1) == semordnilap(str2[-1]) 将这些从函数中单独调用出来。我尝试了几种方法,但我一定没有正确考虑它,当然还有尝试递归执行此操作的踢球者。任何建议或指导都会有所帮助。

def semordnilap(str1, str2):
    '''
    str1: a string
    str2: a string

    returns: True if str1 and str2 are semordnilap
    False otherwise.
    '''
    if len(str1) != len(str2):
        return False
    if len(str1) <= 1 or len(str2) <= 1:
        return False
    if semordnilap(str1[0]) != semordnilap(str2[-1]):
        return False
    else:
        return True

这是我目前所拥有的,得到TypeError: semordnilap() takes exactly 2 arguments (1 given)的错误

【问题讨论】:

  • 你能展示更多你拥有的代码吗?例如,一个简短而完整的 Python 程序怎么样?
  • 要递归地执行此操作(您确实不应该这样做),您可能需要比较两个字符串的末端 (str1[0] == str1[-1]) 并且 then 递归比较其余的 (semordnilap(str1[1:], str1[:-1]))
  • @Lasse 我添加了到目前为止的内容,但它远未完成或工作。

标签: python string recursion


【解决方案1】:

给定两个字符串str1str2,比较其中一个是否等于另一个字符串的最简单方法是使用切片:

str1 = 'racecar'
str2 = 'racecar'

str1 == str2[::-1]
Out[57]: True

这实际上只是检查 str1 是否是回文(即自身的反转)。

如果你真的想要使用递归,你想要使用切片:检查str1[0] == str2[-1],然后递归调用你的函数在str1[1:]str2[:-1] 上。

[::-1] 语法是extended slicing 语法,它适用于字符串以及列表和其他序列。

【讨论】:

  • 冒着听起来像一个真正的业余爱好者的风险......你能告诉我切片发生在“哪里”吗? exp:“[::] 是切片,-1 是重复”...谢谢
  • @Aoxx [::-1] 在这篇文章中有解释:stackoverflow.com/questions/931092/reverse-a-string-in-python
  • @Aoxx 你应该阅读this 部分关于python 教程的字符串。
  • @kren470 谢谢,帮了大忙。
  • @Bakuriu 我将不得不抽出一些时间来阅读(我很容易分心)
【解决方案2】:

要反转字符串,请使用'this is a string'[::-1]

[::-1] 是切片表示法,表示包括从字符串开头到结尾的所有内容,但反过来。 'abcdefghijk'[6:1:-2] 输出 'gec' 因为它从第 6 个索引(从 0 开始)到但不包括第一个索引,以 2 的相反步骤。

详细了解切片符号:Explain Python's slice notationhttp://docs.python.org/2.3/whatsnew/section-slices.html

def semordnilap(str1, str2):
    if str1 == str2[::-1]: return True
    else: return False

一种递归方式:

def semordnilap(str1, str2):
    if not (len(str1) or len(str2)): return True
    if not (len(str1) and len(str2)): return False
    if str1[0] != str2[-1]: return False
    return semordnilap(str1[1:], str2[:-1])

第一行检查两个字符串是否为空(0 计算结果为False,任何其他数字为True)。 len(str1) 以整数形式返回长度。

然后它检查是否只有一个字符串为空,在这种情况下它们不相等。

然后它检查第一个字母是否与最后一个字母相同。

然后它对每个字符串重复该过程(减去 str1 的第一个字母并减去 str2 的最后一个字母)。它一直持续到达到基本案例之一。基本情况是返回的内容。所以它只会在第一个字母等于每轮最后一个字母时返回True,直到两个字符串同时用完字符。

【讨论】:

  • 非常感谢您的详细解释,这有助于我比较两个字符串。
猜你喜欢
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-30
  • 2015-05-14
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多