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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

4回答

6181閲覧

Python3 リスト 複数行 複数項 要素の抽出

python3_beginer

総合スコア46

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2018/04/07 04:40

編集2018/05/12 10:18

質問
複数行あるリストの中身を抽出し、数の比較をしたい
リストの項数も複数あるため、要素の抽出方法がわからない

問題

リストの中身の数が、10以上なら5、9以下なら0を表示させる。

a: リストの行数
b: リストの各行の項数の数
c: リストの中身

問題)
a = 3
b =2
c = [['10', '9'],
['9', '10'],
['10', '9']]

期待する出力)
5 0
0 5
5 0

※数字の間は半角スペース


私の答え)

d = []
for one in c:
for x in one:
x = int(x)
if x >= 10:
x = 5
d.append(x)
else:
x = 0
d.append(x)
出力値)
[5, 0, 0, 5, 5, 0]

疑問点)

どのようなコードを書けば、期待する出力値のようになるのか。

ご教授お願いいたします。


数名の方から回答を頂きました。ありがとうございます。
初心者のため時間はかかりますが、皆さまの回答を自分の知識に吸収できるようにしたいと思います。

まず、LouiS0616さんからのコードを参考にさせて頂きました。

勉強で不足で申し訳ないですが、イメージ図の赤囲みのコードの理解が曖昧な状態です。
最初の2つは、以下のような解釈で合っているでしょうか?
また、最後の1つは全く見当がつきません。
重ね重ね大変恐縮でございますが、教えて頂ければ幸いです。

17行目 d.append([])
リスト中身を []で区切る

32行目 d[-1].append(x)
リストd の最終項まで追加する

36行目 for one in d:
print(*one)
print((*one)) は何を示しているのか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

Python

1c = [ 2 ['10', '9'], 3 ['9', '10'], 4 ['10', '9'] 5] 6 7# この二行は一気に書いても良い 8c = ((int(e) for e in row) for row in c) 9c = [[5 if e >= 10 else 0 for e in row] for row in c] 10 11for row in c: 12 print(*row)

実行結果 Wandbox

5 0 0 5 5 0

ある程度元のコードを活かすなら

二重のリストにしてやれば良いです。

Python

1c = [ 2 ['10', '9'], 3 ['9', '10'], 4 ['10', '9'] 5] 6 7d = [] 8for row in c: 9 d.append([]) 10 for x in row: 11 x = int(x) 12 if x >= 10: 13 x = 5 14 else: 15 x = 0 16 17 d[-1].append(x) 18 19for row in d: 20 print(*row)

Wandbox

質問追記を受けて

二重のリストを利用していることをお忘れなく。

17行目 d.append([])

リスト中身を []で区切る

いいえ。リストに新たに空のリストを追加しています。

32行目 d[-1].append(x)

リストd の最終項まで追加する

いいえ。リストの末尾のリストにxを追加しています。

36行目 for one in d:

print(*one)
print((*one)) は何を示しているのか?

ここではprint(one[0], one[1])と書いているのと同じです。
私の記事で恐縮ですが。Qiita - Python3.xのアスタリスク逆引き

コードの書き方について

teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。
イメージ

投稿2018/04/07 04:47

編集2018/04/07 05:56
LouiS0616

総合スコア35660

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

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

python3_beginer

2018/04/07 05:59

お返事頂きありがとうございます。 コードの詳細説明、添付リストもとても勉強になりました。 私の知識不足で何度も質問する形になってしまい、申し訳ございません。 教えて頂いた知識を生かせるよう、プログラミングの勉強を継続していきたいです。 ありがとございました。
hayataka2049

2018/04/07 06:02

こういうときって、可読性の観点だとこっちの方がわかりやすいんですかね。以下スペースを.で代用 lst = [] for x in なにか: ....tmp = [] ....for y in x: ........何らかの処理 ........tmp.append(何らかの処理結果みたいなの) ....lst.append(tmp)
LouiS0616

2018/04/07 06:08

@python3_beginer さん いえいえ、謝らなくて大丈夫ですよ。誰でも最初は初心者ですから。 勉強頑張ってくださいね。 @hayataka2049 さん 確かにそちらの方が素直な気もしますね。コメントありがとうございます。
python3_beginer

2018/04/10 04:08

LouiS0616さん 初期の質問に加え、追記の質問にも回答して頂きありがとうございます。 再度、本件のコードを見直しましたが、元のコードのひどさに我ながら驚きました。 if文、ループを内包表記で書く、メリットを改めて実感できました。 この数日間LouiS0616さんを含め、さまざまな貴重な意見のおかげで少しです成長を感じられました。 見ず知らずにも関わらずいつも丁寧な解説をしてくださりとても嬉しく思っております。美しいコードを書けるようこれからもがんばります。 ご指導ありがとうございました。
guest

0

ある程度の汎用性を持たせました。

Python

1''' 2input 3 43 52 610 9 78 12 825 1 9 10-- 11 12output 13 145 0 150 5 165 0 17''' 18 19a, b = [int(input()) for _ in range(2)] 20c = [list(map(int, input().split())) for _ in range(a)] 21 22c_trans = [map(lambda x: '05'[x >= 10], i) for i in c] 23print('\n'.join(map(' '.join, c_trans)))

投稿2018/04/07 10:29

arch_

総合スコア158

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

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

python3_beginer

2018/04/10 03:45

お返事頂きありがとうございます。 返信が遅れて申し訳ありません。 リストの中身ごと、条件分岐すれば一行で処理できるのですね。 とても勉強になりました。 ただ、私の勉強不足ゆえ、参照コードの1つ分からない点がございます。 c_trans = [map(lambda x: '05'[x >= 10], i) for i in c] map(lambda x: '05' [x >= 10] x >= 10 のとき、x = 5 と表示 それ以外のとき、 x = 0 と表示 このような解釈で合っているでしょうか? 重ね重ね質問申し訳ありません。
arch_

2018/04/10 03:58

その通りです。 文字列へのアクセスもリストへのアクセスと同様です。
python3_beginer

2018/04/10 04:10

ご解答ありがとうございました。 今後は参照コードを使えるようにがんばります。
guest

0

一行で書いてみました。ご参考になれば。

python

1print("\n".join([" ".join([str(5 if int(one) >= 10 else 0) for one in line]) for line in c]))

投稿2018/04/07 05:14

hayataka2049

総合スコア30933

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

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

python3_beginer

2018/04/10 03:56

お返事頂きありがとうございます。 参照コードを理解するのに、時間がかかってしまし返信が遅れて申し訳ありません。 リストの中にあるリストの中身を比較する際に、いつも1つずつ比較しなければ....と変な発想をもってしまい、今回教えて頂いたコードとは程遠いものになってしまいます。 発想の着眼点、内包表記に気を付けて、いつかhayataka2049さんのようなスマートなコードが書けるようになりたいです。 ご指導ありがとうございました。
guest

0

endパラメータで値の後のに続く文字を指定できます。

Python

1print('start') 2for i in [1,2,3]: 3 print(i, end=' ') # 改行ではなく空白を出力 4print('') # デフォルトで改行が出力される 5print('end')

投稿2018/04/07 04:50

can110

総合スコア38262

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

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

python3_beginer

2018/04/10 03:59

お返事頂きありがとうございます。 空白を出力をする際に、よくパニックなっていました。 こんな便利な処理があるのですね。 今後はendパラメータを利用したいです。 ご指導ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問