我有这段代码来检查字符串是否是回文,用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)
我不明白什么是错的!
答案 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)相同。