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

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

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

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

Q&A

解決済

1回答

12343閲覧

pythonで、リストのリストの名前だけを取得したい

fu_3823

総合スコア81

Python

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

0グッド

0クリップ

投稿2019/12/15 16:32

編集2019/12/15 16:45

以下なのようなリストがあります。

Python

1people_1=["Mike", "Bob", "Ted", "Jeff"] 2people_2=["Ken", "Mic", "Chris"] 3people_3=... 4:::: 5people_8=... 6 7people_list = [people_8, people_7, people_6, people_5, people_4, people_3, people_2, people_1]

このとき、people_listの要素(people_1、people_2…)だけをとり出したいのですが、どのようなコードになるのでしょうか。
どうしても、people_1、people_2の要素["Mike", "Bob", "Ted", "Jeff"]、["Ken", "Mic", "Chris"]まで取り出してしまい、表示が煩雑になってしまうのです。

↓こんな答えがほしいです。入れ子にされたリストの名前です。
people_8
people_7
people_6
::::
people_1

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

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

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

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

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

bamboo-nova

2019/12/15 16:41

すみません...実現したいことの意味が分からなかったので、期待される出力みたいなのを提示していただけるとユーザーさんが答えやすいと思います。
fu_3823

2019/12/15 16:45

↓こんな答えがほしいです。入れ子にされたリストの名前です。 people_8 people_7 people_6 :::: people_1
fu_3823

2019/12/15 16:51

people_1、people_2は、people_listの要素だと思っていたのですが、違うのでしょうか。 people_list = [people_8, people_7… people_1] という表記なので、要素であれば、people_8, people_7…と取り出せそうなきがしたのですが。
hayataka2049

2019/12/15 16:54

違いますよ。私の回答に追記しておきます。
guest

回答1

0

ベストアンサー

people_listの要素(people_1、people_2…)を取り出したいのであれば、people_list[-1]people_list[-2]のようにすればよいのではないでしょうか。それで問題なく["Mike", "Bob", "Ted", "Jeff"], ["Ken", "Mic", "Chris"]が得られるかと思います。

もしかして

people_1のような「文字列」を得たいのでしょうか? そういうことはできません。変数名はソースコード上だけで存在する記号のようなものです。実行時に拾うことはできません。

誤解しているであろうこと

たとえば

python

1a = 10 2print(a)

としたとき、表示されるのはaではなく10であるということは理解できると思います。

同様に

python

1a = 10 2lst = [a]

ではlst変数に結びついているオブジェクトはリテラルで書けば[10]です。

ではなんでそうなるのか。このコードの動作をおおまかに追ってみます(厳密に正確ではありません)。わかりやすいように行ごとに分けます。

(再掲)

python

1a = 10 2lst = [a]
  • 一行目
  1. 構文解析して代入文であること、左辺がaという識別子であること、右辺が10という整数値のリテラルであることを認識する
  2. 右辺の10というリテラルを「評価」し、対応するint型のオブジェクトをメモリ上に生成する
  3. 左辺のaという変数を新たに作り、上で生成したint型のオブジェクトへの参照とaを結びつける
  • 二行目
  1. 構文解析して代入文であること、左辺がlstという識別子であること、右辺が[a]という「aという式(識別子)を単一の要素として持つリストのリテラル」であることを認識する
  2. 右辺の[a]を「評価」する。

 そのためにまず内側にあるaという式を「評価」する。識別子なのがわかっているので同名の変数を探し、一行目で定義されているaであるとわかる。このaに結び付けられたオブジェクト(への参照)が評価した結果になる。
次に外側のリストオブジェクトを一行目と同様に生成し、その0番目の要素に先程aを評価した結果を格納する。
0. 一行目の最後と同様にリストオブジェクトへの参照を変数lstに結びつける

これだけで理解しろというのも酷なのでもう少しわかりやすく書くと、二行目のところはまず[a][10]になってからlstという変数に代入されるイメージです。要するに変数名の情報などリストオブジェクトは持っていないのです。

ならどうするのか

基本的に、多くのプログラミング言語は「ただの変数名」に対して何らかの処理を行うようにはできていません。変数名はソースコードを見やすくするために存在している記号のようなものです。「print(a)のときにはaという情報がprint関数に渡される!」と考えるかもしれませんが、渡されているのはaを評価した結果として得られるオブジェクトであり、どんな変数名に入っていたのかというような情報は一切存在しません。

Pythonのプログラミングで操作の対象にするデータは基本的に、オブジェクトとしてPythonインタプリタが作動するメモリ空間上に存在している必要があります。「名前」を扱いたければ、通常は文字列型オブジェクトを用いると良いでしょう。

python

1people_list = ["people_8", "people_7", "people_6", "people_5", "people_4", "people_3", "people_2", "people_1"] 2for name in people_list: 3 print(name)

これで質問文の「↓こんな答えがほしいです。」が得られます。やった!

……たぶんこれは得たい結果ではないでしょう。["Mike", "Bob", "Ted", "Jeff"], ["Ken", "Mic", "Chris"]など(を評価した結果のオブジェクト)をpeople_listから得る手段は失われました。何をしても"people_1""people_2"など(を評価した結果のオブジェクト)しか得られません。それはそういうものだからですね。

えーっと、やりたいことはたぶん名前と値を紐付けて記憶することでしょう。できなくはありません。リスト型ではできませんが、辞書型を使うとできます。

python

1people_dict = {"people_8":people_8, "people_7":people_7, "people_6":people_6, } # 6以降省略

これでpeople_dict.keys()とでもすればキーの一覧が、people_dict.values()で値の一覧が得られます。両方セットで得たければpeople_dict.items()が使えます。
(すべてビューオブジェクトという特殊なiterableです)

python

1for key in people_dict.keys(): 2 print(key)

ただし、私が書くなら最初からこんな手間はかけずに、

python

1people_dict = dict() 2people_dict[0] = ["Mike", "Bob", "Ted", "Jeff"] 3people_dict[1] = ["Ken", "Mic", "Chris"] 4# ...

とでもしておくでしょう。0から始まる添字にするのはプログラミング上で扱いが楽だからで、0,1,2を必要に応じてpeople_1, people_2, people_3のような文字列に変換することは実際難しくありません(とても容易です)。なお、要素数が予めわかっているなら、辞書の代わりに[None]*8のようなリストを使っても構いませんし、あるいはいっそのこと

python

1people_list = [["Mike", "Bob", "Ted", "Jeff"], 2 ["Ken", "Mic", "Chris"], 3 # ... 4 ]

のように最初に定義してしまうのだって手です。

まとめ

  • 変数名をプログラムから扱うことは通常できない
  • 連番の変数名にするのではなく、最初からプログラムでハンドリングしやすいデータ構造を考えるべき

投稿2019/12/15 16:43

編集2019/12/15 17:32
hayataka2049

総合スコア30933

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

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

fu_3823

2019/12/16 02:28

大変参考になりました。構文解析からの説明は、ピンポイントで疑問点を解消してくれました。 どうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問