teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

Q&A

1回答

2023閲覧

Pythonの2重リスト内包

Beginnerman

総合スコア19

Python

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

0グッド

0クリップ

投稿2019/06/25 09:01

編集2019/06/25 09:43

0

0

2重リスト内包を用いた九九の演算表のプログラムですが、きれいに成形できません。
以下コード

def main(n): print(" ",end="") for i in range(1,n+1): print('%4d'%(i)," ",end="") print('\n') for j in range(1,n+2): print('-----+',end="") print('\n') l = [[x * y for x in range(1,n)] for y in range(1,n)] return l print(enumerate(''.join(main(5)))) for j in range(1,n+2): print('-----+',end="")

以下出力

1 2 3 4 5 -----+-----+-----+-----+-----+-----+ Traceback (most recent call last): print(enumerate(''.join(main(5)))) TypeError: sequence item 0: expected str instance, list found

理想の出力は以下のようなものです

1 2 3 4 5 6 7 8 9 -----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ 1 | 1 2 3 4 5 6 7 8 9 2 | 2 4 6 8 10 12 14 16 18 3 | 3 6 9 12 15 18 21 24 27 4 | 4 8 12 16 20 24 28 32 36 5 | 5 10 15 20 25 30 35 40 45 6 | 6 12 18 24 30 36 42 48 54 7 | 7 14 21 28 35 42 49 56 63 8 | 8 16 24 32 40 48 56 64 72 9 | 9 18 27 36 45 54 63 72 81 -----+-----+-----+-----+-----+-----+-----+-----+-----+-----+

リストの要素から数字のみを取り出すためにjoin関数を使う必要があると思うのですが、enumerateを使用する場合は必要ないのでしょうか?
試行錯誤しましたが手詰まりなので力を貸してください。

試行錯誤し、あとはリスト内の要素を数字だけ抜き出すのみなのですが以下のコードでprintする際にjoinを用いてもエラーが起きます。

def main(n): print(" ",end="") for i in range(1,n+1): print('%4d'%(i)," ",end="") print('\n') for j in range(1,n+2): print('-----+',end="") print('\n') l = [[i * j for i in range(1,n+1)] for j in range(1,n+1)] for z,number in enumerate(l,1): print(z,'|',number) for j in range(1,n+2): print('-----+',end="")

出力

1 2 3 4 5 -----+-----+-----+-----+-----+-----+ 1 | [1, 2, 3, 4, 5] 2 | [2, 4, 6, 8, 10] 3 | [3, 6, 9, 12, 15] 4 | [4, 8, 12, 16, 20] 5 | [5, 10, 15, 20, 25] -----+-----+-----+-----+-----+-----+

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

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

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

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

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

y_waiwai

2019/06/25 09:05

> エラーメッセージ と表示するようなコードは見当たりませんが、本当にそういう結果が表示されたんでしょうか
LouiS0616

2019/06/25 09:07

二重リスト内包って何でしょうか。 内包表記を使っているようではありませんし、ひょっとして俗に言う二次元リストのことですか?
Beginnerman

2019/06/25 09:16

入力するコードを間違えていましたが修正しました。
mather

2019/06/25 09:36 編集

インデントがおかしいですよ。いや、最後のforブロックがそもそも不要なのか。
Beginnerman

2019/06/25 09:44

前の質問は解決しました。 試行錯誤した結果を更新しました。
guest

回答1

0

TypeError: sequence item 0: expected str instance, list found

enumerate ではなく、 "".join(main(5)) で発生しています。
join は文字列の配列を期待しているのに、配列の配列(2次元配列)になっているのでTypeErrorとなっています。

(デバッグするときは複数の関数を同時に一行で実行するのではなく、段階を分けて変数に入れて実行してみるとわかりやすいですよ)

python

1main_result = main(5) 2# この間に具体的なデバッグコードなどが仕込みやすい 3join_result = "".join(main_result)

例えば、以下のようにパーツに分解して出力する部分ごとに整理してみるのはどうでしょうか?

python

1def render_cell(i): 2 return "{:>4d} ".format(i) 3 4def render_row(n, k): 5 return " ".join([render_cell(i*k) for i in range(1,n+1)]) 6 7render_row(9, 2) 8#=> ' 2 4 6 8 10 12 14 16 18 '

投稿2019/06/25 09:46

編集2019/06/25 11:19
mather

総合スコア6762

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問