web-dev-qa-db-ja.com

Pythonロジックを使用して回文をチェックする方法

Pythonで回文をチェックしようとしています。私が持っているコードは、非常にfor- loop集中型です。

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

this ウェブサイトに表示されます。 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を比較するforループを作成し、何かが発生するまでインデックス0 + 1とmax-1をインデックス化します。 Pythonでこれを最適に行う方法

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

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

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

PS:問題は、パリンドロームでもある2つの3桁の整数の最高値の積を見つけることです。

42
DrOnline

特定の値が回文であるかどうかを判断するPythonの方法:

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

説明:

  • nの文字列表現がnの逆の文字列表現と等しいかどうかを確認しています
  • [::-1]スライスは、文字列の反転を処理します
  • その後、==を使用して等価性を比較します
169
Óscar López

かなり直感的ではない[::-1]構文の代替手段は次のとおりです。

>>> test = "abcba"
>>> test == ''.join(reversed(test))
True

reversed関数は、testの文字の逆順を返します。

''.join()は、それらの文字を間に何も入れずに再び結合します。

25
RichieHindle

記録のためだけでなく、特定の文字列が回文であるかどうかを検証するためのよりアルゴリズム的な方法を探している人のために、同じことを達成する2つの方法(whileおよびforループを使用):

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
9

pythonの素晴らしい部分は、それでできることです。文字列にインデックスを使用する必要はありません。

以下が機能します(スライスを使用)

def palindrome(n):
    return n == n[::-1]

単純にnを逆にし、それらが等しいかどうかをチェックします。 n[::-1]はnを反転します(-1はデクリメントすることを意味します)

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

上記に関して、範囲の代わりにxrangeを使用します(範囲は実際のリストを作成しますが、xrangeは高速ジェネレーターであるため)

質問3についての私の意見

Pythonの前にCを学びましたが、ドキュメントを読んで、コンソールを使用してCをいじりました。 (そして、プロジェクトオイラーの問題も同様に:)

7
jh314

機能の方法もあります:

def is_palindrome(Word):
  if len(Word) == 1: return True
  if Word[0] != Word[-1]: return False
  return is_palindrome(Word[1:-1])
3
Khozzy

私はこの質問が少し前に回答されたことを知っており、侵入を謝罪します。しかし、私は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)
2
sanster9292

私が見つけたもっと簡単な方法があります。 1行のみです。

is_palindrome = Word.find(Word[::-1])
1
Inna Bohdanova

あなたはPythonで回文を尋ねています。回文は、文字列、数字、リストに対して実行できます。ただし、文字列の回文を確認する簡単なコードを投稿しただけです。

# Palindrome of string
str=raw_input("Enter the string\n")
ln=len(str)
for i in range(ln/2) :
    if(str[ln-i-1]!=str[i]):
        break
if(i==(ln/2)-1):
    print "Palindrome"
else:
    print "Not Palindrome"
0
techno vimal

上記のソリューションはすべて大文字と小文字を区別するため、ここではcase insensitive関数です。

def Palindrome(string): 

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

この関数はboolean値を返します。

0
Chaker

「アルゴリズム的な」方法:

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
0
sargeMonkey

私はこれを使ってみました:

def palindrome_numer(num):
num_str = str(num)
str_list = list(num_str)
if str_list[0] == str_list[-1]:
    return True
return False

そして、それは数字のために働いたが、文字列かどうかはわかりません

0
mr rasp-crazy

文字列に大文字またはアルファベット以外の文字が含まれている場合、関数はすべての文字を小文字に変換し、最後に正規表現を使用してすべてのアルファベット以外の文字を削除します。

import re

rules = [
    lambda s: any(x.isupper() for x in s),
    lambda s: not s.isalpha()
]


def is_palindrome(s):
    if any(rule(s) for rule in rules):
        s = re.sub(r'[^\w]', '', s).lower()
    if len(s) < 2:
        return True
    if s[0] != s[-1]:
        return False
    return is_palindrome(s[1:-1])


string = 'Are we not drawn onward, we few, drawn onward to new era?'

print(is_palindrome(string))

上記の入力の出力はTrueです。

0
ufukomer
def isPalin(checkWord):
    Hsize = len(lst)/2
    seed = 1
    palind=True
    while seed<Hsize+1:
        #print seed,lst[seed-1], lst [-(seed)]
        if(lst[seed-1] != lst [-seed]):
            palind = False
            break
        seed = seed+1
    return palind

lst = 'testset'
print lst, isPalin(lst)    
lst = 'testsest'
print lst, isPalin(lst) 

出力

testset True
testsest False
0
Its not blank
#compare 1st half with reversed second half
# i.e. 'abba' -> 'ab' == 'ba'[::-1]

def is_palindrome( s ):
   return True if len( s ) < 2 else s[ :len( s ) // 2 ] == s[ -( len( s ) // 2 ):][::-1]
0
lllll
print ["Not a palindrome","Is a palindrome"][s == ''.join([s[len(s)-i-1] for i in range(len(s))])]

これは、単一行コードを記述する典型的な方法です

0
Tarun 007

逆を使用したくない場合は、関数を使用する別の方法があります

#!/usr/bin/python

A = 'kayak'

def palin(A):

    i = 0
    while (i<=(A.__len__()-1)):
        if (A[A.__len__()-i-1] == A[i]):
            i +=1
        else:
         return False

if palin(A) == False:

    print("Not a Palindrome")

else :

    print ("Palindrome")
0
Deba G

pythonでDequesを使用して回文を確認できます

def palindrome(a_string): ch_dequeu = Deque() for ch in a_string: ch_dequeu.add_rear(ch) still_ok = True while ch_dequeu.size() > 1 and still_ok: first = ch_dequeu.remove_front() last = ch_dequeu.remove_rear() if first != last: still_ok = False return still_ok

class Deque: def __init__(self): self.items = [] def is_empty(self): return self.items == [] def add_rear(self, item): self.items.insert(0, item) def add_front(self, item): self.items.append(item) def size(self): return len(self.items) def remove_front(self): return self.items.pop() def remove_rear(self): return self.items.pop(0)

0
Nabaz
def is_palindrome(string):
   return string == ''.join([letter for letter in reversed(string)])
0
Lily P

再帰できれいに見えます!

def isPalindrome(x):
z = numToList(x)
length = math.floor(len(z) / 2)
if length < 2:
    if z[0] == z[-1]:
        return True
    else:
        return False
else:
    if z[0] == z[-1]:
        del z[0]
        del z[-1]
        return isPalindrome(z)
    else:
        return False
0
Harrada
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')
0
John Hutchinson
Word = "<insert palindrome/string>"
reverse = Word[::-1] 
is_palindrome = Word.find(reverse)
print is_palindrome

これは、Udacity comp 101の第1章の質問でした。回文に0を与えると、そうでない場合に-1を与えます。そのシンプルで、ループを使用しません。

0

多分あなたはこれを試すことができます:

list=input('enter a string:')

if (list==list[::-1]):
    print ("It is a palindrome")
else:
   print("it is not palindrome")
0
priya

私はこのコードを書きました:

Word = input("enter: ")
Word = ''.join(Word.split())`
for x in range(len(Word)):
if list(Word)[x] == ((list(Word)[len(Word)-x-1])):
if x+1 == len(Word):
print("its pali")

そしてそれは動作します。 Wordを取得し、スペースを削除してリストに変換し、最初の文字が最後の文字と等しいかどうか、2番目の文字が最後の2番目と等しいかどうかなどをテストします。

その後、「if x + 1 == len(Word)」は、xが0から始まるので1になり、次の..なんとか何とか動作するように動作することを意味します。

0
Zaryab Khan
def pali(str1):
    l=list(str1)
    l1=l[::-1]
    if l1==l:
        print("yess")
    else:
        print("noo")
str1="abc"
a=pali(str1)
print(a)
0
ravi tanwar

それを行うための本当に簡単な方法は

Word = str(raw_input(""))
is_palindrome = Word.find(Word[::-1])
if is_palindrome == 0:
    print True
else:
    print False

そして、ここのif/elseは、派手な見た目のためだけです。パリンドロームについての質問は、QAに関するAmazonのインタビューでした。

0
Nik Latkin

pythonのWatterlooコースを行うと、「レセオン」がここで情報を見つけるのと同じ質問が発生します。

http://cscircles.cemc.uwaterloo.ca/13-lists/

私は初心者なので、次の方法で問題を解決しました:

def isPalindrome(S):
    pali = True
    for i in range (0, len(S) // 2):
        if S[i] == S[(i * -1) - 1] and pali is True:
            pali = True
        else:
            pali = False
    print(pali)
    return pali

この関数はisPalindrome(S)と呼ばれ、文字列 "S"が必要です。戻り値はデフォルトでTRUEで、最初のifステートメントの初期チェックを行います。

その後、forループは文字列の長さの半分を実行して、文字列 "S"の位置 "i"は、正面からも背面からも同じです。そうでない場合、関数は停止し、FALSEを出力してfalseを返します。

Cheers.kg

0
bausi2k

文字列「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
0
blueskin