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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

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

Q&A

解決済

3回答

594閲覧

配列をループ処理を用いて宣言する方法

TKWTsan

総合スコア8

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Python

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

0グッド

0クリップ

投稿2019/10/29 09:03

プログラミング初心者です.
現在,pythonを用いてcsv形式のデータの分析を行っております.
前提として,csv,numpy,pandasなどのモジュールを使用しないプログラムを組んでおります.

idの数分だけ配列を宣言し,idごとにデータを配列に格納した後,idごとのvalueの平均値を求めるというプログラムを作成したのですが,
以下のようにとても長いプログラムになってしまいました.
プログラムを簡略化する方法があればご指摘いただきたいです.
特に知りたい点は,配列や変数の宣言をループ処理を用いて行うことは可能なのか,
また,いくつかの配列に関して一括でループ処理を行うことは可能なのかという点です.
よろしくお願いします.
(プログラムの後にデモのファイルを記しました.)

PYTHON

1filepath = 'demo.csv' 2 3with open(filepath,) as f: 4 data2=[] 5 for line in f: 6 line = line.replace('\n','') 7 data = line.split(',') 8 data2.append(data) 9id1=[] 10id2=[] 11id3=[] 12id4=[] 13id5=[] 14 15for i in data2: 16 if i[1] =='1': 17 id1.append(i) 18 19for i in data2: 20 if i[1] =='2': 21 id2.append(i) 22 23for i in data2: 24 if i[1] =='3': 25 id3.append(i) 26 27for i in data2: 28 if i[1] =='4': 29 id4.append(i) 30 31for i in data2: 32 if i[1] =='5': 33 id5.append(i) 34sum1=0 35sum2=0 36sum3=0 37sum4=0 38sum5=0 39 40for i in id1: 41 sum1= int(i[2]) + sum1 42ave1=sum1/len(id1) 43 44for i in id2: 45 sum2= int(i[2]) + sum2 46ave2=sum2/len(id2) 47 48for i in id3: 49 sum3= int(i[2]) + sum3 50ave3=sum3/len(id3) 51 52for i in id4: 53 sum4= int(i[2]) + sum4 54ave4=sum4/len(id4) 55 56for i in id5: 57 sum5= int(i[2]) + sum5 58ave5=sum5/len(id5) 59 60print(ave1) 61print(ave2) 62print(ave3) 63print(ave4) 64print(ave5)

idは1から5の乱数,valueは10から20の乱数で作成しました.
no,id,value
1,1,16
2,1,20
3,4,11
4,3,15
5,3,18
6,2,16
7,1,14
8,4,15
9,2,10
10,2,19
11,2,11
12,5,14
13,1,19
14,4,10
15,5,18
16,2,10
17,2,11
18,2,10
19,2,12
20,3,14
21,5,14
22,4,11
23,2,11
24,1,14
25,2,12
26,1,17
27,2,13
28,4,12
29,1,20
30,1,11

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

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

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

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

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

guest

回答3

0

簡単なところから。

python

1for i in data2: 2 if i[1] =='1': 3 id1.append(i) 4 5for i in data2: 6 if i[1] =='2': 7 id2.append(i) 8 9for i in data2: 10 if i[1] =='3': 11 id3.append(i) 12 13for i in data2: 14 if i[1] =='4': 15 id4.append(i) 16 17for i in data2: 18 if i[1] =='5': 19 id5.append(i)

どうしてこう書こうと思ったのかはわかりませんが、forループ1つで良いことは明らかです。

python

1for i in data2: 2 if i[1] =='1': 3 id1.append(i) 4 if i[1] =='2': 5 id2.append(i) 6 if i[1] =='3': 7 id3.append(i) 8 if i[1] =='4': 9 id4.append(i) 10 if i[1] =='5': 11 id5.append(i)

次。

python

1id1=[] 2id2=[] 3id3=[] 4id4=[] 5id5=[]

これと同じものを自動生成することはできません。残念。

変数を5つ作るより良いやり方があるからですが。

たとえばlistのlistにするとか。

python

1ids = [[], [], [], [], []]

これはループでも生成できます。

python

1ids = [] 2for _ in range(5): 3 ids.append([])

リスト内包表記も使えます。

python

1ids = [[] for _ in range(5)]

で、仮にこの表現を採用するなら、ループ部分は以下のようになります。

python

1for i in data2: 2 if i[1] =='1': 3 ids[0].append(i) 4 if i[1] =='2': 5 ids[1].append(i) 6 if i[1] =='3': 7 ids[2].append(i) 8 if i[1] =='4': 9 ids[3].append(i) 10 if i[1] =='5': 11 ids[4].append(i)

これはこれで元のコードとほぼ等価の記述ができていますが(indexは0から数え始まるのでそれだけは慣れてください)、いかにも間抜けです。

今回はi[1](csvのid列)が都合よく1から5の数字なので、これをうまく活用すると良いのかもしれません。

python

1for i in data2: 2 ids[int(i[1]) - 1].append(i)

でもまあ、こんなに都合の良い場合は少ないので、もう少し汎用性をもたせようとするとdictを使うことになります。

python

1ids = {"1":[], "2":[], "3":[], "4":[], "5":[]}

みたいな形で初期化しておけば、

python

1for i in data2: 2 ids[i[1]].append(i)

で済みます。ただし、予めキーがわからないこともあるでしょう、というわけで、そういうときは標準ライブラリのcollectionsモジュールからdefaultdictクラスをimportして使うと便利です。

python

1from collections import defaultdict 2 3ids = defaultdict(list)

としておけば、存在しないキーは空のリストで初期化してくれます。


とりあえず辞書にしたとしておく。ループ処理は簡単に可能です。

python

1for k, v in ids.items(): 2 ...

この場合、辞書のキーの順序は都合よく出てこないので、昇順になることを望むのであればソートする。自分が設定した任意の順番で出させたいのであれば、望む順序になっているキーのlistで回すかする必要があるでしょう。

python

1for k in sorted(ids.keys()): 2 v = ids[k] 3 ... 4

python

1for k in ["1", "2", "3", "4", "5"]: 2 v = ids[k] 3 ... 4

あとはこの中で平均の計算を書けば良いです。

python

1for k in ["1", "2", "3", "4", "5"]: 2 v = ids[k] 3 s = 0 4 for x in v: 5 s += int(x[2]) 6 ave = s / len(v) 7 print(ave)

でも、これにループを使うのは大げさで、sum関数とジェネレータ式の組み合わせで書けば十分です。

python

1for k in ["1", "2", "3", "4", "5"]: 2 v = ids[k] 3 ave = sum(int(x[2]) for x in v) / len(v) 4 print(ave) 5

投稿2019/10/29 11:22

hayataka2049

総合スコア30933

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

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

TKWTsan

2019/10/29 13:36

部分ごとに詳細な説明ありがとうございます。 参考にさせていただきます。
guest

0

ベストアンサー

以下のようになるかと思います。
既存の処理をループ処理でdictに格納するようにしています。

※ファイル読み込み部については既存コードに置き換えてください。

python

1a = """no,id,value 21,1,16 32,1,20 429,1,20 530,1,11""" # データは途中省略 6 7data2 = [] 8for line in a.split('\n')[1:]: 9 data = line.split(',') 10 data2.append(data) 11result = {} 12for d in data2: 13 l = result.get(d[1], []) 14 l.append(d) 15 result[d[1]] = l 16 17for k, v in result.items(): 18 ave = sum([int(l[2]) for l in v]) / len(v) 19 print('key: {}, ave: {}'.format(k, ave))

投稿2019/10/29 09:34

yamap55

総合スコア1376

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

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

TKWTsan

2019/10/29 10:02

回答ありがとうございます。 申し訳ないのですが、下2つのfor文についてもう少し詳細に説明して頂けないでしょうか。
TKWTsan

2019/10/29 13:34

辞書型の基礎的なことが理解できていませんでした。 ありがとうございました。
guest

0

配列の配列の使い方を覚えるといいと思います。

Python

1id = [] 2 3id[1] = []

投稿2019/10/29 09:42

otn

総合スコア84708

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

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

hayataka2049

2019/10/29 10:47

pythonの場合はその通りに書くとエラーになります。
otn

2019/10/29 10:49

失礼しました。いくつも書くのめんどくさいなと思ってずぼらを考えたらミスってしまいました。 id = [ [], [], [], [], [], [] ] ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問