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

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

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

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

Q&A

解決済

4回答

935閲覧

Python3 リストの中にあるリスト 要素抽出方法

python3_beginer

総合スコア46

Python 3.x

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

0グッド

0クリップ

投稿2018/04/08 03:35

編集2018/04/08 03:42

目標)
筋トレの記録をまとめるアプリをつくりたい

一回の筋トレで
胸、背中、脚、腕の4種目を行う

それぞれの扱ったダンベルの重さを記入してもらう

一回分の記録例)
chest, back, leg, arm
40 30 50 15

このように、一回の記録を N回分記録する。
最後にはそれぞれの部位別に最大重量を表示する

入力例)
N = 5
40 30 50 15
43 22 45 10
40 25 40 10
45 30 40 12
35 30 55 20

出力例)

45 30 55 20

問題)

リストの中にあるリストの特定の要素抽出方法がわからない。
リストのindex番号を利用して、新しくリストを作成
繰り返しのため、for文、zip()を利用したいが、うまくコードをかけない。
よりスマートな方法があれば、ご教授お願い致します。

赤の縦ラインで、新しくリストを作りたい。

イメージ説明

私のコード)

N = int(input())

a = [list(map(int,input().split())) for i in range(N)]
print(a)

chest = []
back = []
leg = []
arm = []

total_chest = a[0][0], a[1][0], a[2][0], a[3][0], a[4][0]
print(total_chest)

total_back = a[0][1], a[1][1], a[2][1], a[3][1], a[4][1]
print(total_back)

total_leg = a[0][2], a[1][2], a[2][2], a[3][2], a[4][2]
print(total_leg)

total_arm = a[0][3], a[1][3], a[2][3], a[3][3], a[4][3]
print(total_arm)

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

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

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

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

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

guest

回答4

0

とりあえず入力まで済ませたとして、

python

1>>> lst = [[40, 30, 50, 15],[43, 22, 45, 10],[40, 25, 40, 10],[45, 30, 40, 12],[35, 30, 55, 20]] 2>>> from pprint import pprint 3>>> pprint(lst) 4[[40, 30, 50, 15], 5 [43, 22, 45, 10], 6 [40, 25, 40, 10], 7 [45, 30, 40, 12], 8 [35, 30, 55, 20]]

列ごとにmaxを取れれば良い訳です。簡単なのはnumpyを使う方法です。

python

1>>> import numpy as np 2>>> np.array(lst).max(axis=0).tolist() 3[45, 30, 55, 20]

pure pythonで書くとしたら、方法はいろいろあります。とりあえず、ぱっと思いついた奴だけ。

python

1# 転置したリストの行ごとにmaxを取る。参考:https://qiita.com/mas9612/items/821fbb4c881b7a836451 2>>> [max(col) for col in zip(*lst)] 3[45, 30, 55, 20] 4# reduceを使う 5>>> from functools import reduce 6>>> reduce(lambda row1, row2:[b if a < b else a for a, b in zip(row1, row2)], lst) 7[45, 30, 55, 20]

投稿2018/04/08 03:59

編集2018/04/08 04:00
hayataka2049

総合スコア30933

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

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

arch_

2018/04/08 04:04

zip(*list)面白いですね!
hayataka2049

2018/04/08 04:09

こんな書き方ができるのか! という発見があるのがpythonやる楽しさですよね(「There should be one-- and preferably only one --obvious way to do it.」はどうした)
python3_beginer

2018/04/08 12:52

お返事頂きありがとうございます。 こんなスマートな書き方があるのかと!!と驚く反面、新しい情報が多くて少しパニックなってしまいました。貴重なアドバイスなので時間をかけて吸収したいと思います。 ありがとうございました。
guest

0

Numpyを利用しない方法

// 転置
a = list(zip(*a))

output = list(map(max,a))

投稿2018/04/08 06:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

python3_beginer

2018/04/10 06:38

お返事頂きありがとうございます。 転置のzip()を利用し,map()でそれぞれの処理を行うのは全く思いつきませんでした。 この2行のおかげで、多くの知識に触れられました。ご指導ありがとうございます。
guest

0

胸筋、背筋などの部位ごとのリストへの変換方法だけ置いていきます。

Python

1chest = [trial[0] for trial in a] 2back = [trial[1] for trial in a] 3leg = [trial[2] for trial in a] 4arm = [trial[3] for trial in a]

あとは適当にsummaxなどを使えば所望の結果は得られると思います。

投稿2018/04/08 05:06

tachikoma

総合スコア3601

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

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

python3_beginer

2018/04/10 06:42

お返事頂きありがとうざいました。 全体のデータからループ処理を利用したら、こんな簡単にまとめられるんですね。勉強になりました。 ご指導ありがとうございます。
guest

0

ベストアンサー

モジュールを使いましょう!
リストに関する数値操作であればnumpyが便利です。

ゼロからデータ構造やアルゴリズムを考えるのはとても良い勉強になります。
しかし、案外自分よりも上手く考えられたものが手近に転がっているので、それに感謝して組み込むことで、自分のやりたいことがスマートに片付けられるようになります。

python

1import numpy as np 2 3training_records = np.array([ 4 list(map(int, input().split())) 5 for _ in range(int(input())) 6]) 7 8print(' '.join(map(str, training_records.max(axis=0))))

投稿2018/04/08 03:57

編集2018/04/08 03:58
arch_

総合スコア158

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

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

python3_beginer

2018/04/08 12:54

お返事頂きありがとうございます。 スマートすぎて驚くのと同時にpytyonの凄さに感動致しました。 今後はデータ構造やアルゴリズムも勉強していきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問