2017-08-09 7 views
-4

皆さん私はvimにいる間に使用できるシンプルなツールボックスを作って、Pythonの学習を始めることを目指しています。ここでは、10進数のバイナリを作成しようとしていますが、反復中にリストを変更することはできません。私はPython初心者です.Cから来てありがとう。 これは私が精神的にしようとしていることです:反復中にリストを変更することはできません

100 - > [1 * 2^2、0 * 2^1、0 * 2^0] - > 4 + 0 + 0 = 4

import sys 

#binary to decimal 

print("Needs to be ran in python3\n") 
print("Value:") 

digits=input() 
# add except statement here 
length=len(digits)-1 
digits = [int(x) for x in str(digits)] 

print(digits) 

for x in range(len(digits)): 
     digits=x*(2**length) 
     length=length-1 

sum=sum(digits) 
print(sum) 
+2

'digits = x = x *(2 ** length)'?私には正しいとは思わないが、私はPythonを知らない。とにかく、失敗した入力と出力した例を挙げるべきです。 – hnefatl

+6

なぜあなたはそれを反復処理中にリストを変更しようとしていますか?この目的のために – user2357112

+0

@ user2357112 [1 * 2^2、0 * 2^1、0 * 2^0]だから配列を合計することができます – gethelplearning

答えて

3

digits=x*(2**length) 

は「x*(2**length)を保持する変数digitsを設定」を意味します。 digitsは数字のリストにアクセスする唯一の方法であり、あなたはそれを1桁の数字にするだけでした。残りのリストにアクセスできなくなりました。そして、Pythonはこれを認識してリストを破棄します。代わりに、digits[x]でアクセスできるdigitsx番目の要素を設定するように見えます。これは、あなたが望む線があることを意味します

digits[x] = digits[x]*(2**length) 

しかし、これはこの目標を達成する最良の方法ではありません。一つのこととして、あなたは数字の束を加えているだけです。リストを変更することなくそれを行う方が簡単です。たとえば:今、私たちはxにアクセスする唯一の方法は、呼び出すことである

注意を

total = 0 

for x in range(len(digits)): 
     total += digits[x] * (2**length) 
     length=length-1 

print(total) 

は(それは多くの場合、組み込みの名前を上書きするために、悪い考えですので、私は totalsumから変数名を変更しました) digits[x]。このループは全く length変数を必要としないために簡略化することができ

total = 0 

for digit in digits: 
     total += digit * (2**length) 
     length=length-1 

print(total) 

:それはむしろインデックスよりも、リスト自体を反復するために、一般的に多くの慣用的だ

total = 0 

for digit in digits: 
     total *= 2 
     total += digit 

print(total) 

これは最初のtotalを倍増し、その後に次の桁を追加します。これは両方とも読みやすくなります(lengthという名前は通常の合計での長さであるため、変更されません)、数字がわからなくても機能します。 (それはinput()の結果だから)あなたは変換する必要はありませんので、digitsはすでにstrで、この時点で

digits = [int(x) for x in str(digits)] 


別のノートでは、あなたがdigitsリストを生成する方法でありますそれはstrへの呼び出しを伴います。ちょうど[int(x) for x in digits]


最後に、これのすべてのためのより簡単な方法があります。私たちはPythonインタプリタにコマンドhelp(int)を実行した場合、我々は次のようにintコンストラクタが文書化されていることを参照してください。

int(x=0) -> integer
int(x, base=10) -> integer

整数に数値や文字列を変換し、または全く場合は0を返します引数 が与えられます。 xが数字の場合は、x.__int__()を返します。浮動小数点数が の場合、これはゼロに向かって切り捨てられます。

xは数ないか、または塩基が与えられた場合、xは 所与ベースでリテラル整数を表す文字列、 バイト、またはByteArrayインスタンスでなければならない場合。リテラルの前には、'+'または'-'があり、空白は で囲むことができます。基数のデフォルトは10です。有効な基数は0と2〜36です。 ベース0は、文字列からのベースを整数リテラルとして解釈することを意味します。

>>> int('0b100', base=0) 
4 

これは、あなたは自分のプログラム全体もちろん

# There's no need to import sys; you never use it 

#binary to decimal 

# Your original program do the same thing in Python 2 and 3 
print("Value:") 

digits=input() 
print(int(digits, 2)) 

を作ることができることを、そのバージョンは、Pythonを学ぶために始めてのあなたの規定の目的でのように良い仕事をしないことを意味します。万が一

+0

どうすればこれをアップホートできますか? ;) よくやった! –

+0

@ PM2Ring私が含まなかったあなたのOPコメントで言及した唯一のことは、文字列を直接反復していたことです。私はそれを考えましたが、forループのたびに 'int'を呼び出す必要がありました。私はそれをもっときれいにすることを好むことができます。 –

0

は、あなたのためのループで

digits[x] = x*(2**length) 

を書くことを意味したのですか? digitsがリストにあるので、基本的には、ループ全体のdigitsリストを1つの値に設定しています。それを試して、それが動作するかどうかを見てください。

関連する問題