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

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

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

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

Q&A

解決済

4回答

570閲覧

Python3 スコア集計 リストの中身

python3_beginer

総合スコア46

Python 3.x

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

0グッド

1クリップ

投稿2018/04/19 06:07

編集2018/04/24 04:31

ハイスコアランキング

score = [
[10, 12, 3, 4],
[20, 42, 42, 45],
[23, 45, 32, 45],
[34, 23, 55, 54],
[65, 99, 34, 56]
]

data のリストの中身を以下のようなルールで計算したい

まず、1行目のリストにある項数を、2行目以下のリストにあるそれぞれの項数に掛ける

そして、掛け合わした数の和を求めたい

イメージ説明

コード score = [ [10, 12, 3, 4], [20, 42, 42, 45], [23, 45, 32, 45], [34, 23, 55, 54], [65, 99, 34, 56] ] 例えば、1行目と2行目の掛け算はそれぞれ a = score[0][0] * score[1][0] b = score[0][1] * score[1][1] c = score[0][2] * score[1][2] d = score[0][3] * score[1][3] そして、すべての和を求めたいので total = a+b+c+d となる。

これを1行目と3行目、 1行目と4行目と最後まで繰り返したい。

コード a = score[0][0] * score[2][0] b = score[0][1] * score[2][1] c = score[0][2] * score[2][2] d = score[0][3] * score[2][3] a = score[0][0] * score[3][0] b = score[0][1] * score[3][1] c = score[0][2] * score[3][2] d = score[0][3] * score[3][3] a = score[0][0] * score[4][0] b = score[0][1] * score[4][1] c = score[0][2] * score[4][2] d = score[0][3] * score[4][3] total = [] for x in range(5): for i in range(4): s = score[0][0]* score[x][i] print(s) total.append(s) print(total) 出力値 [100, 120, 30, 40, 200, 420, 420, 450, 230, 450, 320, 450, 340, 230, 550, 540, 650, 990, 340, 560] 期待値 [[100, 120, 30, 40], [200, 420, 420, 450], [230, 450, 320, 450], [340, 230, 550, 540], [650, 990, 340, 560]]

#質問

上記の出力値は、20個の要素がある

二重のリストにして、期待値のように4個ずつに分けた二重リストを出力したい

ヒントまたは方法を教えて頂きたいです。

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

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

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

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

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

LouiS0616

2018/04/19 06:19

入力例に対して出力例がありませんが、93842600で合ってますか?
python3_beginer

2018/04/19 06:23

失礼しました。期待値を追記致しました。
fuzzball

2018/04/19 06:38

期待値に一行目×一行目の出力がありますが、必要なのでしょうか?
fuzzball

2018/04/19 06:47 編集

期待値が全て「10を掛けた値」(score[0][0]を掛けた値)になっていますが、それでいいのでしょうか?
python3_beginer

2018/04/19 06:57

本当は、score[0][0]を省きたくて、 s = score[0][0]* score[x+1][i] としたのですが、範囲外になってしまったので、リスト作成後に削除することにしました。
hayataka2049

2018/04/19 07:00

s = score[0][0]* score[x][i]はs = score[0][i]* score[x][i]な気がするのと、問題文を読むと一行目*一行目は外してやる必要がある気がします
python3_beginer

2018/04/19 11:39

hayataka2049さんの仰る通りですね。2点間違っておりますね。
guest

回答4

0

難しく考えず、一行ずつ求めていけば良いと思いました。

python

1score = [ 2[10, 12, 3, 4], 3[20, 42, 42, 45], 4[23, 45, 32, 45], 5[34, 23, 55, 54], 6[65, 99, 34, 56] 7] 8 9def mullst(lst1, lst2): 10 return [a*b for a,b in zip(lst1, lst2)] 11 12line0 = score[0] 13print([sum(mullst(line0, line)) for line in score[1:]])

投稿2018/04/19 07:06

hayataka2049

総合スコア30933

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

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

python3_beginer

2018/04/19 11:48

確かに、zipを使って一行ずつ求めればいいですね。 答えを聞くと簡単だなと思うのですが、ゼロベースで答えまで行くのは難しいですね。 ご指導ありがとうございました。
hayataka2049

2018/04/19 13:08

プログラミングの教科書などにもよく書いてあることですが、 ・最終的な出力のイメージをちゃんと持っておく(今回の出力値であれば、電卓叩けば手計算で出るのですから、先に出しておいてそれにプログラムを合わせていく形で書いた方が良かったかもしれません) ・擬似コードを書く(これは慣れれば頭の中でできるようになりますが、最初はいちいち書き下した方が良いかも) このあたりを徹底した方が良いのかもしれません。
python3_beginer

2018/04/19 13:16

アドバイスありがとうございます。 2点を重視しながら続けていきたいと思います。 ありがとうございます。
guest

0

ヒント1: range

python

1print([x for x in range(5)]) 2#[0, 1, 2, 3, 4] 3 4print([x for x in range(1, 5)]) 5#[1, 2, 3, 4]

ヒント2: 二次元配列

python

1total = [] #外側のリスト 2for x in range(3): 3 row = [] #内側のリスト 4 for i in range(5): 5 row.append(x * 10 + i) #内側のリストに追加 6 total.append(row) #(内側のリストを)外側のリストに追加 7print(total) 8# [[0, 1, 2, 3, 4], [10, 11, 12, 13, 14], [20, 21, 22, 23, 24]]

投稿2018/04/19 07:03

編集2018/04/19 07:10
fuzzball

総合スコア16731

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

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

python3_beginer

2018/04/19 11:49

ヒント2のロジックがわかっていませんでした。 内側のリストに追加と(内側のリストを)外側のリストに追加のところがとても勉強になりました。 ご指導ありがとうございました。
guest

0

python

1total = [] 2 3for x in range(5): 4 total.append([]) 5 for i in range(4): 6 s = score[0][0]* score[x][i] 7 print(s) 8 total[-1].append(s) 9print(total) 10

投稿2018/04/19 06:28

編集2018/04/19 07:18
hiro-k

総合スコア902

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

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

python3_beginer

2018/04/19 11:50

繰り返し処理の部分にリストを追加すればいいんですね。 スッキリしました! ご指導ありがとうございました。
guest

0

ベストアンサー

ちょっと読みづらくなりますが、良く使われる手法です。

Python

1data = [100, 120, 30, 40, 200, 420, 420, 450, 230, 450, 320, 450, 340, 230, 550, 540, 650, 990, 340, 560] 2data = [list(row) for row in zip(*[iter(data)]*4)] 3 4print(data)

実行結果 Wandbox

[[100, 120, 30, 40], [200, 420, 420, 450], [230, 450, 320, 450], [340, 230, 550, 540], [650, 990, 340, 560]]

ref

イテラブルの左から右への評価順序は保証されています。そのため zip(*[iter(s)]*n) を使ってデータ系列を長さ n のグループにクラスタリングするイディオムが使えます。これは、各出力タプルがイテレータを n 回呼び出した結果となるよう、 同じ イテレータを n 回繰り返します。これは入力を長さ n のチャンクに分割する効果があります。

2.7なのでちょいと古いですが、本質的な意味は同じです。

投稿2018/04/19 06:26

編集2018/04/19 06:31
LouiS0616

総合スコア35660

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

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

python3_beginer

2018/04/19 11:51

またかっこいい手法が.... 頭が混乱しないように復習します! ご指導ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問