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

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

新規登録して質問してみよう
ただいま回答率
85.35%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

2回答

1000閲覧

AOJ - コードをもっと短くしたい

esklia

総合スコア81

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

1グッド

0クリップ

投稿2020/04/03 11:53

編集2020/04/14 15:40

AOJの
Matrix Vector Multiplication
からです。行列と配列の内積をnumpyを使用せずに求める問題で
下記コードにてacceptedしたのですが、
個人的に改善したい点があります。
range(len(M)),range(len(ans))←コードの視認性を悪くする
vec = 0←他の簡潔な方法があるのではないか
➂そもそものコードが長いような気がする(forを多用している気がする、関数にして呼び出すのもありだが、そもそもの行数をもっと短くしたい)
以上の点についてアドバイスをお願いできないでしょうか。

n, m = map(int, input().split()) M = [] for i in range(1, n+1): row = list(map(int, input().split())) M.append(row) v = [] for i in range(1, m+1): v.append(int(input())) ans = [] for i in range(len(M)):                 ← vec = 0    ← for j in range(len(M[0])): b = M[i][j] * v[j] vec += b ans.append(vec) for i in range(len(ans)):   ← print(ans[i])
LouiS0616👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

だいぶすっきりしました。

Python

1def dot_vec(vec1, vec2): 2 # assert len(vec1) == len(vec2) 競プロなら不要か 3 return sum( 4 e1 * e2 for e1, e2 in zip(vec1, vec2) 5 ) 6 7ans = [ 8 dot_vec(row, v) for row in M 9]
  • 関数を適宜定義する
  • 内包表記やジェネレータ式、組み込み関数を活用する

出力ももっとすっきり書けます。

Python

1print(*ans, sep='\n')

あるいは

Python

1for e in ans: 2 print(e)

range(len(...)) を使わなければいけない場面はそんなに多くない筈です。

投稿2020/04/03 12:21

編集2020/04/04 01:57
LouiS0616

総合スコア35668

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

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

esklia

2020/04/04 06:41

ご回答くださりありがとうございます。内包表記とzipでだいぶ変わりますね、、出力も工夫の余地がまだまだあることが分かりました。ありがとうございました。
guest

0

pythpn3

1M = [ 2 [10, 20, 30], 3 [40, 50, 60] 4] 5v = [1, 2, 3] 6 7ans = [sum(e * v[i] for i, e in enumerate(row)) for row in M] 8print('\n'.join(map(str, ans)))

参考情報

  • Pythonで配列の中身をprintするときの実行速度比較

https://qiita.com/chiruno/items/21b65573bb696f4ce3ce

投稿2020/04/05 04:07

katoy

総合スコア22324

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

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

esklia

2020/04/05 06:06

ご回答くださりありがとうございます。printの仕方で実行速度が異なるというのはあまり考えていませんでしたのでとても勉強になります。記事の方も拝見させていただきます。有益な記事と実装例を教えて下さりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問