質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

1768閲覧

整数を各桁の数に分ける

aiueo04

総合スコア26

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/24 05:56

引数に入ってきた整数を各桁に分け、各桁の位をかけ、最後には文字列として表示・
例えば、12=“10+2”,345="300+40+5”,70704="70000+700+4"のように表示したいです(0から始まるけたのかずは飛ばします。)。最後の出力は文字列として出力したいです。

自分が書いたコードはlen()でlistの要素の数をしらべ、その(len(list)-1)**10のかずを一番大きい位の数にかけ、そのあとlistのindexをインクリメント、(len(list)-1)をデクリメントさせかけ合わせていくというのをループします。

がしかし、12のときは2となり42のときは2となり,なぜかいちのくらいしかでません。
なお、0からはじまるものはremoveとstartwith(0)をつかえばけせるかなとはおもっています

ご指摘お願いします。ご教授ください

def expanded_form(num): list=[int(a) for a in str(num)] print(list) keta=len(list) print(keta) index=0 while keta>=1: list_2=[] numb=list[index]*(10**(keta-1)) keta-=1 index+=1 numb=str(numb) list_2.append(numb) return("+".join(list_2))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

次のコードの実行結果は分かりますか。

Python

1for i in range(3): 2 lst = [] 3 lst.append(i) 4 5print(lst)

出力は [2] です。
もし [0, 1, 2] だと思ったのなら、ループの挙動への理解が足りないです。


ループはfor文やwhile文で実現できますが、その実は**『ブロック内の繰り返し』**です。
上記のコードは次のように書いているのと同じように動作します。

Python

1i = 0 2lst = [] 3lst.append(i) 4 5i = 1 6lst = [] 7lst.append(i) 8 9i = 2 10lst = [] 11lst.append(i) 12 13print(lst)

このコードならば、実行結果が [2] になることに気付けるのでは無いでしょうか。


さて、質問のコードを振り返ってみます。

Python

1while keta>=1: 2 list_2=[] 3 ... 4 list_2.append(numb)

return("+".join(list_2))

なぜ上手く動作しないのか、今なら分かりますね。

投稿2020/04/24 06:08

編集2020/04/24 06:09
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiueo04

2020/04/24 06:25

なるほど!!!list_2をなんかいも上書きしていたのですね!非常にありがたい限りです!!
guest

0

ベストアンサー

ちゃんと見てないですけど、多分 while の中の list_2 の初期化が原因では?
ループのたびに上書きしています。

追記
デバッガ動かして、変数の推移を見るのでもいいですけど、以下のようなサイトを利用するのもおすすめです。

http://pythontutor.com

投稿2020/04/24 06:05

編集2020/04/24 06:12
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiueo04

2020/04/24 06:27

このサイトで段階を一つ一つ確認できたので今回のミスに気づけました!これからフル活用していきます。
guest

0

4 つの方法を示します。

  • 質問文のコードを修正したもの
  • さらに変数を練らす等してみたもの
  • str(num) でなく、 num の 商/余りの計算して処理するようにしたもの
  • while をつかわないでかいてみたもの

pp.py

python3

1def expanded_form(num): 2 digits = [int(a) for a in str(num)] 3 keta = len(digits) 4 index = 0 5 list_2 = [] 6 while keta >= 1: 7 numb = digits[index] * (10 ** (keta - 1)) 8 keta -= 1 9 index += 1 10 if numb > 0: 11 list_2.append(str(numb)) 12 13 return(" + ".join(list_2)) 14 15def expanded_form_x(num): 16 digits = [int(a) for a in str(num)] 17 d_len = len(digits) 18 terms = [] 19 for i in range(len(digits)): 20 n = digits[i] * (10 ** (d_len - i - 1)) 21 if n > 0: 22 terms.append(str(n)) 23 24 return(" + ".join(terms)) 25 26def expanded_form_y(num): 27 terms = [] 28 zeros = "" 29 while num > 0: 30 num, d = num // 10, num % 10 31 if d > 0: 32 terms.insert(0, str(d) + zeros) 33 zeros += "0" 34 35 return " + ".join(terms) 36 37def expanded_form_z(num): 38 digits = [int(x) for x in str(num)] 39 muls = reversed([10 ** i for i in range(len(digits))]) 40 return " + ".join([str(n * mul) for n, mul in zip(digits, muls) if n > 0]) 41 42for n in [0, 12, 345, 70809]: 43 print(expanded_form(n)) 44 print(expanded_form_x(n)) 45 print(expanded_form_y(n)) 46 print(expanded_form_z(n)) 47 print() 48

実行例:
イメージ説明

投稿2020/04/25 00:37

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

直接の回答ではないですが、こんな書き方ができるという例を示しておきます。
ひどい書き方なので真似しなくていいですが、いつかこのコードが読める日が来ることを期待して・・・

python

1def expanded_form(num): 2 return '+'.join([d + '0'*i for i, d in enumerate(str(num)[::-1]) if d != '0' or num == 0][::-1]) 3 4print(expanded_form(0)) 5print(expanded_form(12)) 6print(expanded_form(345)) 7print(expanded_form(70704)) 8print(expanded_form(90900))

投稿2020/04/24 08:41

編集2020/04/25 01:42
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問