2017-04-30 7 views
0

文字列が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'が回文であると結論づけます。そうでなければ、そうではありません。 はしかし、私は、2行目にエラーが出る -

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

私が間違っているのか理解していません!

+0

文字列の例を示します。 – RomanPerekhrest

答えて

0

2つのiterableをまとめてZIPする必要があります。これは、別の解決策である

for i,j in zip(reversed(s),range(0,len(s))): 
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') 
2

を解決するための最もコンパクトな形です。 だけのorignalの文字列との一致を逆に

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

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

それはあなたが取得している理由を説明しませんがZohabの答えは、私はあなたがする望んでいるものを達成んだろうな方法であるため、とValueError(そしてあなたその将来的にはもう一度やり直してしまうだろう)。

あなたがしようとしているように見えるのは、反転された反復可能な "s"をその長さに基づく遠隔の反復可能なものに揃えることです。 「Hello World」のの入力と、それは基本的に次のように実行します、だから、

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

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 
をPythonインタプリタとして(おおよそ)あなたのコードを読んでいるので、これが書かれたとして、失敗している理由は、

明らかに、これはあなたがしたいことではありません。

TimGJが述べたように、zip()関数を使用すると、反転された文字を範囲の数(0、len(s) ))。結果は次のようになります。

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

しかし、このような範囲に圧縮することは、Allenが指摘したようにenumerate()関数ですでにカバーされています。

また、範囲(n)が範囲(0、n)と同じであることもわかります。

関連する問題