people_listの要素(people_1、people_2…)を取り出したいのであれば、people_list[-1]
やpeople_list[-2]
のようにすればよいのではないでしょうか。それで問題なく["Mike", "Bob", "Ted", "Jeff"]
, ["Ken", "Mic", "Chris"]
が得られるかと思います。
もしかして
people_1
のような「文字列」を得たいのでしょうか? そういうことはできません。変数名はソースコード上だけで存在する記号のようなものです。実行時に拾うことはできません。
誤解しているであろうこと
たとえば
としたとき、表示されるのはa
ではなく10
であるということは理解できると思います。
同様に
ではlst
変数に結びついているオブジェクトはリテラルで書けば[10]
です。
ではなんでそうなるのか。このコードの動作をおおまかに追ってみます(厳密に正確ではありません)。わかりやすいように行ごとに分けます。
(再掲)
- 構文解析して代入文であること、左辺が
a
という識別子であること、右辺が10
という整数値のリテラルであることを認識する
- 右辺の
10
というリテラルを「評価」し、対応するint
型のオブジェクトをメモリ上に生成する
- 左辺の
a
という変数を新たに作り、上で生成したint
型のオブジェクトへの参照とa
を結びつける
- 構文解析して代入文であること、左辺が
lst
という識別子であること、右辺が[a]
という「a
という式(識別子)を単一の要素として持つリストのリテラル」であることを認識する
- 右辺の
[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 ]
のように最初に定義してしまうのだって手です。
まとめ
- 変数名をプログラムから扱うことは通常できない
- 連番の変数名にするのではなく、最初からプログラムでハンドリングしやすいデータ構造を考えるべき