无法使用Python找到回文字符串

时间:2017-04-30 19:06:59

标签: python

我有这段代码来检查字符串是否是回文,用Python编写。

s=input()
for i,j in reversed(s),range(0,len(s)):
    if (i == s[j]):
        continue
    else:
        break
if (j == len(s)-1):
    print('Yes')
else:
    print('No')

我首先以相反的顺序遍历变量's'并检查它是否与原始变量相同。如果是,则循环继续;否则,退出。 最后,我检查循环变量'i'的值。如果它等于弦的长度,我得出结论,'s'是回文;否则,事实并非如此。 但是,我在第二行收到错误 -

for i,j in reversed(s),range(0,len(s)):
ValueError: too many values to unpack (expected 2)

我不明白什么是错的!

4 个答案:

答案 0 :(得分:2)

这是最紧凑的解决方案。 只需反转字符串并与orignal匹配

is_palindrome = lambda s: str(s) == str(s)[::-1]

>>> is_palindrome('abcba')
>>> True

答案 1 :(得分:0)

您需要将两个可迭代的ZIP压缩在一起。尝试

for i,j in zip(reversed(s),range(0,len(s))):

答案 2 :(得分:0)

# use enumerate
for j,i in enumerate(reversed(s)):
    if (i == s[j]):
        continue
    else:
        break
if (j == len(s)-1):
    print('Yes')
else:
    print('No')

这是另一种解决方案:

#s[::-1] reverses the string
print('Yes') if s==s[::-1] else print('No')

答案 3 :(得分:0)

Zohab的答案就是我想要达到你希望做的事情的方式,虽然它没有解释为什么你会得到那个ValueError(因此你可能会在将来再次遇到它)

您尝试做的是将反向迭代“s”与基于其长度的范围可迭代对齐。这是因为写入失败的原因是因为Python解释器正在将您的代码(粗略地)读取为:

for reference in [reversed(s),range(0,len(s))]:
    (i,j) = reference

因此,输入“Hello World”时,它基本上会像这样运行:

for reference in [reversed("Hello World"),range(0,len("Hello World"))]:
    ## First Iteration
    reference = "dlroW olleH"
    i =  reference[0] ## "d"
    j = reference[1]  ## "l"
    ValueError ## We don't have a variable to assign reference[2]/"r" to

显然,这不是你想要做的。

正如TimGJ所说,这个确切错误的解决方案是使用zip()函数,它将创建一个新对象,将反转(s)的字符与范围数量(0,len(s))配对)。这导致:

for i,j in (("d",0),("l",1),etc...):
    ## First iteration
    i = "d"
    j = 0

这是你想要的。但是,像Allen指出的那样,压缩到这样的范围已经被enumerate()函数所覆盖。

我还要注意 - 纯粹是为了澄清 - 范围(n)与范围(0,n)相同。