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

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

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

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

Q&A

解決済

4回答

10637閲覧

Pythonの複数の空のリスト生成

gymgym

総合スコア97

Python 3.x

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

1グッド

3クリップ

投稿2017/11/30 11:23

編集2017/11/30 15:47

Python

1a, b, c, d, e, f = [], [], [], [], [], []

このような方法だとリストの数が増えると無駄なコードが多くなる気がします。
空のリストを作るときにfor文などで効率よくリストを生成することができますか。

このあとに、別々の複数の値を各リストに代入したいと考えています。
リストには、区別のつくように名前をつけたいと思っています。

よろしくおねがいします。

physics303👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

註:直接的な回答ではありません。

実際のコードを見てみないとなんとも言えないですが...
ある程度リスト内包表記を使いこなせるなら、空のリストを宣言する場面は少ないです。

効率よく空のリストを生成する方法より先に、
空のリストを要しないコーディングを意識した方がよいかと思います。


一般に内包表記は速度も速く、(慣れれば)読みやすく簡潔です。

例:3の含まれる数字だけを抽出

Python

1dst_list = [] 2for i in range(100): 3 if '3' in str(i): 4 dst_list.append(i)

Python

1dst_list = [i for i in range(100) if '3' in str(i)]

内包表記を使うと...
・ 速度面で有利
・ 行数が減る
・ 慣れると簡潔で読みやすい
・ Python使いこなしてる感が出る

投稿2017/11/30 11:27

編集2017/11/30 11:49
LouiS0616

総合スコア35660

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

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

mkgrei

2017/11/30 11:59

内包表記で空リスト大量生成で、「無駄に洗練された無駄の無い無駄な動き」を連想しました。
LouiS0616

2017/11/30 12:14

パワーワード感すごいですね...
gymgym

2017/11/30 15:43

質問の内容が具体的でなくてすみません。 リストの区別がつくようにわかりやすい名前をそれぞれつけて別々の複数の値をそれぞれのリストに代入したいと考えています。 言葉だけで伝わりづらいかと思うのですが、このような場合だとどのようにしたら良いのでしょうか。
LouiS0616

2017/11/30 16:53 編集

質問の意図は理解しているつもりですが、そもそも空のリストを何個も初期化する設計自体が少々よろしくないので、以上のような回答を書きました。 直接的な解決策はmkgreiさんの回答の通りです。 ちょっとアレンジして a, b, c, d, e, f = [[] for i in range(6)] と書けばよいです。 しかし、これはmkgreiさんご本人が言っているように、『無駄に洗練された無駄の無い無駄な動き』だと思います。(つまり現行の設計上は一番良い解法だが、そもそも設計に無駄が多い)
gymgym

2017/12/01 01:56

ありがとうございます。 参考にさせていただきます。
mkgrei

2017/12/01 04:48

以下設計時の雑感 pythonはメモリ管理がガーベージコレクションによって行われるので、変数のスコープを意識する必要があります。 変数に固有の名前をつけたいというのはグローバル変数が必要となっている設計となるので、できるのなら避けた方がよいです。 リストがたくさんある場合はうまいルールで構造化することが望ましいです。 変数名がたくさんあると覚えるのが大変で、動的に変数の中身を変えられるスクリプト言語では事故が起こりやすいです。 質問の中にもあるように、リストがたくさんあると煩雑になることを認識していると思われます。つまり書きにくて、読みにくいコードが仕上がる可能性が高いです。 また、リストを一気に宣言するような考え方はコンパイル言語の方が強い気がします。 スクリプト言語では使用する近辺で定義して、もう使われなくなったら自動的に破棄されるような書き方がメジャーだと思われます。
LouiS0616

2017/12/01 05:12

スコープの先頭で変数をどびゃっと宣言するサンプルがネット上に溢れかえっているのは、C言語がプログラミング入門に広く用いられている弊害な気がします。 近年の言語では(というかCでもそんなに古くなければ)わりあい自由に宣言および初期化/代入が行えるので、もはや先頭での宣言を採用するメリットはほとんどないですよね。
LouiS0616

2017/12/01 05:18

Pythonのこのような記法は未だに慣れませんが... ぎょっとしてしまう。 if : ...hoge = fuga else: ...hoge = piyo print(hoge)
gymgym

2017/12/01 05:45

まさに自分がコードを書く際、リストをたくさん宣言して変数を処理することが多いです。 そうすると、やはりコードが読みにくくて困っています。
LouiS0616

2017/12/01 06:10

スコープが非常に広い変数が多い場合は、クラスを適切に用いればすっきりすることがあります。 ただし、クラスの作りが甘いと、かえってごちゃごちゃしたコードになってしまいますので、ある程度時間をかけてオブジェクト指向を学ぶ必要があります。 純粋な学習目的ではなく課題で/研究で/仕事でコードを書いている場合、なかなか時間も確保できないかもしれませんが、以降のコーディングの助けにはなります。
gymgym

2017/12/01 06:23

ありがとうございます。 オブジェクト指向を学び見やすいコードをかけるようにがんばります。
guest

0

python

1empty_lists = [[] for i in range(10)]

で10個の空リストを作れます。
空リストの用途次第ですね。

投稿2017/11/30 11:32

mkgrei

総合スコア8560

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

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

0

[追記]
ごめんなさい、コード部分空のリスト10個作るのではなく長さ10のリストを作っていただけでしたので修正しました。

python

1import numpy as np 2 3empty_lists = np.empty((10, 1)) 4print(empty_lists.size) 5""" 6>>> 10 7"""

numpyでせめてみます。

投稿2017/11/30 11:46

編集2017/11/30 12:03
wakame

総合スコア1170

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

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

0

これでもいけそう

Python

1empty_lists = [[]] * 10

投稿2017/11/30 23:10

magichan

総合スコア15898

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

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

LouiS0616

2017/11/30 23:32

それだと各要素のidが同じになっちゃうみたいです。詳細な動作は追ってませんが、結果的に。
magichan

2017/11/30 23:36

おーーーーっ! 確かにリストの場合は全て同じ参照になりますね。 すっかり忘れておりました。 コメントありがとうございます。
mkgrei

2017/12/01 04:37

これはpythonを扱う上で覚えなければならないアンチパターンの1つです。 書き方が素直なのに、このような振る舞いが望ましいケースが思い当たりません。 とても教育的な例だと思われます。
LouiS0616

2017/12/01 05:01 編集

for a, b, c in zip(*[iter(hoge)]*3): という用法では望ましいかと思います。 どのセクションか忘れましたが、チュートリアルでも紹介されています。 追記:ドキュメントではzipと同時に紹介されていました。 https://docs.python.jp/3/library/functions.html#zip
mkgrei

2017/12/01 04:54

恐れ入ります。 勉強になりました。 今までこのような状況に出会うと困ってしまうのでnumpy.arrayに突っ込んでreshapeして凌いでいました。 または、[a[3*i:3*(i+1)] for i in range(len(a)//3)]とかまどろっこしいことをしていました。 iterと組み合わせるといろいろできそうですね。
magichan

2017/12/01 04:56

うーん。わかっているつもりでも、つい書いてしまいますね。 LouiS0616さんの用法は面白そうなので、後から試してみます。 あとそのまま np.array([[1,2,3]] * 3) とnumpy配列化すると、問題にならなかったりします。
mkgrei

2017/12/01 05:01

numpy配列にキャストされる時に別のオブジェクトとして展開されるんでしょうか。 カッコ閉じの場所が意図した場所なのかひやひやしますが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問