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つのハッシュは、私自身のリマインダーです。
具体的な質問:
Cでは、インデックス0とインデックスmaxを比較するforループを作成し、何かが発生するまでインデックス0 + 1とmax-1をインデックス化します。 Pythonでこれを最適に行う方法
私のforループ(範囲内(999、100、-1))、これはPythonでそれを行うのに悪い方法ですか?
誰かが私の立場の人々のために良いアドバイス、良いウェブサイト、またはリソースを持っていますか?私はプログラマーではありません。私は1人になりたいとは思っていません。学士号の論文(電気工学)を書くときに、同時にプログラミング言語を学習する必要がないように、十分に学びたいだけです。プロジェクトで良い結果を得るために。 「基本的なCからPythonの優れたアプリケーションに移行する方法」、そのようなこと。
この問題に対する優れたソリューションを作成するための特定のコードも歓迎します。優れたアルゴリズムを学ぶ必要があります。3つの状況を想定しています。値がゼロまたは1桁の場合、長さが奇数の場合、および長さが偶数の場合。 forループを書くことを計画していました...
PS:問題は、パリンドロームでもある2つの3桁の整数の最高値の積を見つけることです。
特定の値が回文であるかどうかを判断するPythonの方法:
str(n) == str(n)[::-1]
説明:
n
の文字列表現がn
の逆の文字列表現と等しいかどうかを確認しています[::-1]
スライスは、文字列の反転を処理します==
を使用して等価性を比較しますかなり直感的ではない[::-1]
構文の代替手段は次のとおりです。
>>> test = "abcba"
>>> test == ''.join(reversed(test))
True
reversed
関数は、test
の文字の逆順を返します。
''.join()
は、それらの文字を間に何も入れずに再び結合します。
記録のためだけでなく、特定の文字列が回文であるかどうかを検証するためのよりアルゴリズム的な方法を探している人のために、同じことを達成する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
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をいじりました。 (そして、プロジェクトオイラーの問題も同様に:)
機能の方法もあります:
def is_palindrome(Word):
if len(Word) == 1: return True
if Word[0] != Word[-1]: return False
return is_palindrome(Word[1:-1])
私はこの質問が少し前に回答されたことを知っており、侵入を謝罪します。しかし、私は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)
私が見つけたもっと簡単な方法があります。 1行のみです。
is_palindrome = Word.find(Word[::-1])
あなたは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"
上記のソリューションはすべて大文字と小文字を区別するため、ここではcase insensitive関数です。
def Palindrome(string):
return (string.upper() == string.upper()[::-1])
この関数はboolean値を返します。
「アルゴリズム的な」方法:
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
私はこれを使ってみました:
def palindrome_numer(num):
num_str = str(num)
str_list = list(num_str)
if str_list[0] == str_list[-1]:
return True
return False
そして、それは数字のために働いたが、文字列かどうかはわかりません
文字列に大文字またはアルファベット以外の文字が含まれている場合、関数はすべての文字を小文字に変換し、最後に正規表現を使用してすべてのアルファベット以外の文字を削除します。
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
です。
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
#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]
print ["Not a palindrome","Is a palindrome"][s == ''.join([s[len(s)-i-1] for i in range(len(s))])]
これは、単一行コードを記述する典型的な方法です
逆を使用したくない場合は、関数を使用する別の方法があります
#!/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")
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)
def is_palindrome(string):
return string == ''.join([letter for letter in reversed(string)])
再帰できれいに見えます!
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
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')
Word = "<insert palindrome/string>"
reverse = Word[::-1]
is_palindrome = Word.find(reverse)
print is_palindrome
これは、Udacity comp 101の第1章の質問でした。回文に0を与えると、そうでない場合に-1を与えます。そのシンプルで、ループを使用しません。
多分あなたはこれを試すことができます:
list=input('enter a string:')
if (list==list[::-1]):
print ("It is a palindrome")
else:
print("it is not palindrome")
私はこのコードを書きました:
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になり、次の..なんとか何とか動作するように動作することを意味します。
def pali(str1):
l=list(str1)
l1=l[::-1]
if l1==l:
print("yess")
else:
print("noo")
str1="abc"
a=pali(str1)
print(a)
それを行うための本当に簡単な方法は
Word = str(raw_input(""))
is_palindrome = Word.find(Word[::-1])
if is_palindrome == 0:
print True
else:
print False
そして、ここのif/elseは、派手な見た目のためだけです。パリンドロームについての質問は、QAに関するAmazonのインタビューでした。
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
文字列「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