2016-05-30 4 views
0

下記[不完全]コードは長さ、N X の数でX-Nを取り、次pandigital数の値を返すように設計されています。このコードは、nxの間の番号が、関数の引数として渡された番号に含まれていないことを特定し、(その時点で関数がさらに開発されるまで)、2つのリスト、元の番号自体個々のリストのメンバーとして数字、およびリストと、メンバーとしてXに番号Nと、長さの元の数がXNがTrueブール値によって置き換えられるで存在するそれらの数とパイソン、リスト追加真のブール

def nextPandigital(n,lower,upper): 
    digits = [] 
    requiredDigits = [] 

    #Completed loop 
    for digit in str(n): 
    digits.append(int(digit)) 

    #Completed loop 
    for num in range(lower,upper+1): 
    requiredDigits.append(num) 

    for number in requiredDigits: 
     if str(number) in str(digits): 
      x = requiredDigits.index(number) 
      #requiredDigits[x] = 'True' 
      requiredDigits[x] = True 
    return digits, requiredDigits 

EnthoughtキャノピーにおけるnextPandigital(1023456789,0,9)の入力パラメータのために、第二のリストは[True,True,True,True,True,True,True,True,True,True]を読むべき戻さ、が、第二のリストの値は1からであり、実際には[True,1,True,True,True,True,True,True,True,True]を返さ元requiredDigitsリストはTrueに置き換えられていません。

私はループと全く問題、またはコードの一般的な流れは、コードのrequiredDigits[x] = True行がコメントしており、現在、コメントコードがコメント解除され、それが意図されたように、コードが動作したときのために、存在しないことを知っていますrequiredDigits内のすべての数字が文字列値「True.

によって置き換えられているとし、私はこの問題を解決しようと試みてきました。しかし、私はその原因を突き止めることができません。私は事実を考慮したTrue == 1がTrueを返します。ただし、Trueの値がFalseに置き換えられた場合、requiredDigits[x] = Trueのコードは意図したとおりに動作します。

この件に関する回答/助言/提案/アドバイスは高く評価されます。前もって感謝します。

+0

* n *から* x *までの数字は、質問には与えられた数字* n *から与えられた数字* x *までのすべての数字が含まれることを意味します。 –

答えて

0

問題をを使用しているチェック210を使用して、どこに割り当てるかを見つけます。Trueは1に等しいので、0に入力したTrueは、次に置き換えたい1であると誤解しています。

解決策ではなくindexを使用して、後でそれらを見つけるために必要とするよりも、あなたはあなたのリストを反復処理するようインデックスを取得するためにenumerateを使用することです:

for x, number in enumerate(requiredDigits): 
    if str(number) in str(digits): 
     requiredDigits[x] = True 

一般的により良い解決策は、リストの内包表記を使用することですむしろ数字で始まり、後にそれらのいくつかを交換するよりも、一度にリストを作成する:

requiredDigits = [True if num in digits else num for num in range(lower,upper+1)] 

を私はまた、メンバーシップ・テスト・AGAにstrへの不要な呼び出しを取り除く取得していますinst digits。数値自体がリストに含まれているかどうかをテストするのではなく、部分文字列のテストを行っていました。あなたが気にする数字はすべて1桁の長さで、リストの文字列表現には余計な数字がないので、おそらくエラーを引き起こすことはありませんでした。しかし、一般的には、必要がないときに文字列操作を使用するのは良い考えではありません。

+0

答えをありがとう。それは本当に助けになりました。しかし、私は* enumerate *の正確な目的を理解できません。リストの各メンバーに対して、単にインデックス値に似たプレースメント値を割り当てますか、それとももっと何かをしますか? –

+0

組み込み関数 'enumerate'はどのような種類の反復可能でも機能します。 iterableの個々の値を 'index、value'2-tuplesに変換します。 [そのドキュメント](https://docs.python.org/3/library/functions.html#enumerate)、[PEP 279](http://www.python.org/peps/pep-0279)を読むことができます。 .html)は、バージョン2.3でPythonへの追加を提案しました。 – Blckknght

+0

したがって、本質的に* x、number *はタプルの2つの値を表す変数です。 –

0

更新している同じリストを確認しています。これはです。常に危険です。 2回目の反復で

あなたの変数は次のとおりです。

number=1 
requiredDigits = [True, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

あなたがrequiredDigits.index(1)を行っているときに試合があるけど、それはTrue==1で起こるので、それはそう、それがインデックスという返す1に到達していない0

しかし、一般的には、この実装はあまりニシキヘビではない、より良いBlckknght's answer

+0

この回答は私のコードの根本的な問題を理解し、Blckknghtの答えを理解するのに役立ちました。ありがとう! –

関連する問題