52

Pythonで回文をチェックしようとしています。私が持っているコードは非常にforループ集約的です。

そして、C から Python に移行するときに人々が犯す最大の間違いは、Python を使用して C ロジックを実装しようとすることです。これにより、動作が遅くなり、言語を最大限に活用できていません。

このサイトで見ます。Python には C スタイルの for ループがないため、「C スタイルの for」を検索します。時代遅れかもしれませんが、Python には独自のメソッドがあることを意味すると解釈します。

私は周りを見回してみましたが、これに関する最新の (Python 3) アドバイスはあまり見つかりません。for ループを使用せずに、Python で回文の課題を解決するにはどうすればよいですか?

クラスでは C でこれを行いましたが、個人的には Python で行いたいと考えています。問題はEuler Projectからのものです。ところで、素晴らしいサイトです。

def isPalindrome(n):
    lst = [int(n) for n in str(n)]
    l=len(lst)
    if l==0 || l==1:
        return True
    elif len(lst)%2==0:
        for k in range (l)
        #####
    else:
        while (k<=((l-1)/2)):
            if (list[]):
                #####   

for i in range (999, 100, -1):
    for j in range (999,100, -1):
        if isPalindrome(i*j):
            print(i*j)
            break

ここには多くのコードがありません。5 つのハッシュは、自分自身へのリマインダーです。

具体的な質問:

  1. C では、インデックス 0 をインデックス max と比較し、次にインデックス 0+1 を max-1 と比較して何かが起こるまで for ループを作成します。Pythonでこれを行うにはどうすればよいですか?

  2. 私の for ループ (範囲内 (999, 100, -1) で、これは Python で行うには悪い方法ですか?

  3. 私の立場にある人々のための良いアドバイス、良いウェブサイト、またはリソースはありますか? 私はプログラマーではありません。志望しているわけでもありません。学士号の論文 (電気工学) を書くときに、適切なプログラミング言語を同時に学習する必要がないように、十分に学びたいだけです。プロジェクトで良い結果を得るために。「基本的な C から Python の優れたアプリケーションへの移行方法」、そのようなことです。

  4. この問題を解決するための特定のコードも歓迎します。優れたアルゴリズムを学ぶ必要があります。3 つの状況を想定しています。値がゼロまたは 1 桁の場合、長さが奇数の場合、および長さが偶数の場合。for ループを書くつもりだった...

PS: 問題は次のとおりです。回文でもある 2 つの 3 桁の整数の最大値の積を見つけます。

4

34 に答える 34

14

記録のために、そして与えられた文字列が回文であるかどうかを検証するためのよりアルゴリズム的な方法を探している人のために、同じことを達成する2つの方法(whileforループを使用):

def is_palindrome(word):

    letters = list(word)    
    is_palindrome = True
    i = 0

    while len(letters) > 0 and is_palindrome:       
        if letters[0] != letters[(len(letters) - 1)]:
            is_palindrome = False
        else:
            letters.pop(0)
            if len(letters) > 0:
                letters.pop((len(letters) - 1))

    return is_palindrome

そして....2番目のもの:

def is_palindrome(word):

    letters = list(word)
    is_palindrome = True

    for letter in letters:
        if letter == letters[-1]:
            letters.pop(-1)
        else:
            is_palindrome = False
            break

    return is_palindrome
于 2016-06-13T05:23:42.350 に答える
6

以下のコードは、回文の場合は0を出力し、それ以外の場合は-1を出力します

最適化されたコード

word = "nepalapen"
is_palindrome = word.find(word[::-1])
print is_palindrome

出力: 0

word = "nepalapend"
is_palindrome = word.find(word[::-1])
print is_palindrome

出力: -1

説明:

文字列を検索すると、返される値は、文字列が始まる場所の値です。

そのため、場所をword.find(word[::-1])見つけて逆にすると、まだ場所にあるので返されます。nepalapen0[::-1]nepalapennepalapen00

を検索しnepalapendてから逆方向nepalapenddnepalapenレンダリングすると、FALSEステートメントnepalapendが逆にdnepalapenなり、検索が失敗して、文字列が見つからないことを示すnepalapend値が返されます。-1


別のメソッドは、回文の場合はを出力し、そうでない場合は偽を出力します

word = "nepalapen"
print(word[::-1]==word[::1])

出力: TRUE

于 2014-09-11T18:16:09.163 に答える
2

この質問は少し前に回答されたことを知っており、侵入をお詫びします。しかし、私はPythonでもこれを行う方法に取り組んでおり、次のように私が行った方法を共有すると思いました.

word = 'aibohphobia'

word_rev = reversed(word)

def is_palindrome(word):
    if list(word) == list(word_rev):
        print'True, it is a palindrome'
    else:
        print'False, this is''t a plindrome'

is_palindrome(word)
于 2015-12-29T07:11:35.547 に答える
1

私が見つけたはるかに簡単な方法があります。たったの1行です。

is_palindrome = word.find(word[::-1])
于 2016-03-21T18:07:22.553 に答える
0

文字列「s」を想定

palin = lambda s: s[:(len(s)/2 + (0 if len(s)%2==0 else 1)):1] == s[:len(s)/2-1:-1]  
# Test
palin('654456')  # True
palin('malma')   # False
palin('ab1ba')   # True
于 2016-07-29T02:20:40.743 に答える
0

上記のソリューションはすべて大文字と小文字を区別するため、ここでは大文字と小文字を区別しない関数を使用します。

def Palindrome(string): 

  return (string.upper() == string.upper()[::-1]) 

この関数はブール値を返します。

于 2015-01-27T20:34:22.997 に答える
0
import string

word = input('Please select a word to test \n')
word = word.lower()
num = len(word)

x = round((len(word)-1)/2)
#defines first half of string
first = word[:x]

#reverse second half of string
def reverse_odd(text):
    lst = []
    count = 1
    for i in range(x+1, len(text)):

        lst.append(text[len(text)-count])
        count += 1
    lst = ''.join(lst)
    return lst

#reverse second half of string
def reverse_even(text):
    lst = []
    count = 1
    for i in range(x, len(text)):
        lst.append(text[len(text)-count])
        count += 1
    lst = ''.join(lst)
    return lst


if reverse_odd(word) == first or reverse_even(word) == first:
    print(string.capwords(word), 'is a palindrome')
else:
    print(string.capwords(word), 'is not a palindrome')
于 2017-06-25T01:53:27.133 に答える
0

「アルゴリズム」の方法:

import math

def isPalindrome(inputString):
    if inputString == None:
        return False

    strLength = len(inputString)
    for i in range(math.floor(strLength)):
        if inputString[i] != inputString[strLength - 1 - i]:
            return False
    return True
于 2017-07-04T01:45:30.707 に答える
0

ブール値を返すこのワンライナーを使用できます。

str(x)==str(x)[::-1]

これは、型キャストのおかげで単語と数字の両方で機能します...

于 2022-01-15T16:30:04.207 に答える
-1
#!/usr/bin/python

str = raw_input("Enter a string ")
print "String entered above is %s" %str
strlist = [x for x in str ]
print "Strlist is %s" %strlist
strrev = list(reversed(strlist)) 
print "Strrev is %s" %strrev
if strlist == strrev :
   print "String is palindrome"
else :
   print "String is not palindrome"
于 2016-02-21T13:06:22.280 に答える
-1

ユーザーの入力を受け取り、入力が回文であるかどうかを確認する例を次に示します。

name = input("Write your word here:  ")
input("Press <enter> to check if the word is a palindrome.")
if str(name) == str(name)[::-1]:
    print("True")
else:
    print("False")

ifただし、 /elseステートメントを設定する必要さえありません。次に示すように、論理比較の結果を直接出力できます。

name = input("Write your word here:  ")
input("Press <enter> to check if the word is a palindrome.")
print(str(name) == str(name)[::-1])
于 2014-08-03T22:01:37.883 に答える