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

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

ただいまの
回答率

91.37%

  • Python 3.x

    2394questions

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

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

解決済

回答 4

投稿 2017/11/30 20:23 ・編集 2017/12/01 00:47

  • 評価
  • クリップ 0
  • VIEW 154

asoaso

score 9

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+8

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

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

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


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

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

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

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

投稿 2017/11/30 20:27

編集 2017/11/30 20:49

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/30 20:59

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

    キャンセル

  • 2017/11/30 21:14

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

    キャンセル

  • 2017/12/01 00:43

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

    キャンセル

  • 2017/12/01 01:53 編集

    質問の意図は理解しているつもりですが、そもそも空のリストを何個も初期化する設計自体が少々よろしくないので、以上のような回答を書きました。

    直接的な解決策はmkgreiさんの回答の通りです。
    ちょっとアレンジして a, b, c, d, e, f = [[] for i in range(6)] と書けばよいです。
    しかし、これはmkgreiさんご本人が言っているように、『無駄に洗練された無駄の無い無駄な動き』だと思います。(つまり現行の設計上は一番良い解法だが、そもそも設計に無駄が多い)

    キャンセル

  • 2017/12/01 10:56

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

    キャンセル

  • 2017/12/01 13:48

    以下設計時の雑感

    pythonはメモリ管理がガーベージコレクションによって行われるので、変数のスコープを意識する必要があります。
    変数に固有の名前をつけたいというのはグローバル変数が必要となっている設計となるので、できるのなら避けた方がよいです。
    リストがたくさんある場合はうまいルールで構造化することが望ましいです。

    変数名がたくさんあると覚えるのが大変で、動的に変数の中身を変えられるスクリプト言語では事故が起こりやすいです。

    質問の中にもあるように、リストがたくさんあると煩雑になることを認識していると思われます。つまり書きにくて、読みにくいコードが仕上がる可能性が高いです。

    また、リストを一気に宣言するような考え方はコンパイル言語の方が強い気がします。
    スクリプト言語では使用する近辺で定義して、もう使われなくなったら自動的に破棄されるような書き方がメジャーだと思われます。

    キャンセル

  • 2017/12/01 14:12

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

    キャンセル

  • 2017/12/01 14:18

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

    キャンセル

  • 2017/12/01 14:45

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

    キャンセル

  • 2017/12/01 15:10

    スコープが非常に広い変数が多い場合は、クラスを適切に用いればすっきりすることがあります。
    ただし、クラスの作りが甘いと、かえってごちゃごちゃしたコードになってしまいますので、ある程度時間をかけてオブジェクト指向を学ぶ必要があります。

    純粋な学習目的ではなく課題で/研究で/仕事でコードを書いている場合、なかなか時間も確保できないかもしれませんが、以降のコーディングの助けにはなります。

    キャンセル

  • 2017/12/01 15:23

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

    キャンセル

+2

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


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

投稿 2017/11/30 20:32

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

import numpy as np

empty_lists = np.empty((10, 1))
print(empty_lists.size)
"""
>>> 10
"""


numpyでせめてみます。

投稿 2017/11/30 20:46

編集 2017/11/30 21:03

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

これでもいけそう

empty_lists = [[]] * 10

投稿 2017/12/01 08:10

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/01 08:32

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

    キャンセル

  • 2017/12/01 08:36

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

    キャンセル

  • 2017/12/01 13:37

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

    キャンセル

  • 2017/12/01 14:01 編集

    for a, b, c in zip(*[iter(hoge)]*3): という用法では望ましいかと思います。
    どのセクションか忘れましたが、チュートリアルでも紹介されています。

    追記:ドキュメントではzipと同時に紹介されていました。
    https://docs.python.jp/3/library/functions.html#zip

    キャンセル

  • 2017/12/01 13:54

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

    キャンセル

  • 2017/12/01 13:56

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

    キャンセル

  • 2017/12/01 14:01

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

    キャンセル

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

ただいまの回答率

91.37%

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    2394questions

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