アプリ版:「スタンプのみでお礼する」機能のリリースについて

pythonのリスト、配列と並びによるデータの読み込みについて理解しにくいことがあるのでお尋ねします。以下のようなソース(抜粋)があります。
-----
data = [[] for i in range(SETSIZE)]

<省略>

for i in range(SETSIZE):
line = input()
data[i] = [int(num) for num in line.split()]
-----

この内容はdataというリスト(配列?)を仕立てて、リスト(配列?)であるdataに1行読み込んだ後、分割する。それをすべての行でやる、ということです。

そうしますと、dataというリストのサイズは2次元配列のようになってしまうようです。実際、data[10][3]というものをプリントすることもできます。そうなると、コードの最初の行でサイズをSETSIZEで指定したものとは違うように思われ、違和感があるのですが、どのように解釈したらいいでしょうか。SETSIZE=10で、10分割されたら、dataというリストは10x10の2次元配列みたいになります。しかし、冒頭では10と宣言しているわけですが。
この辺が腑に落ちないと多次元データの読み込みで勘違いしそうなのですが。

また、このプログラム動作のイメージですが、1行読んで分割する、1行読んで分割する、というリズムになっているようです。ファイルのセパレータ(空白とかカンマとかいろいろ)が変わった場合はどうなるでしょうか。

さらに、このプログラムを実行する場合にファイル指定はコマンドライン風になっています。
python abc.py < data.in で"data.in"というファイル指定します。それをinput()で受けているのでしょうか。それをやめてソース内にフルパスで読み込みファイル指定をした場合、どのようなコードになるでしょうか。

以上、python勉強中ですが、他の言語の仕様と比べてファイル入出力が独特な感じがして戸惑っております。

よろしくお願いします。

A 回答 (4件)

「リダイレクトしないでファイル名を指定して読み込む」ってのは, たとえば


https://docs.python.org/ja/3/library/fileinput.h …
ってなことか?
    • good
    • 0

う~ん、1次元の配列を2階層重ねたのが


2次元配列のように見えるだけで
cの2次元配列とは別物なのだが
大丈夫だろうか?
#所謂ジャグ配列

また、動的配列は Java、c#、Javascript、・・・etcと
超が付くメジャーなデータ型です。

>それをやめてソース内にフルパスで読み込みファイル
>指定をした場合、どのようなコードになるでしょうか。

公式チュートリアルなら
https://docs.python.org/ja/3/tutorial/inputoutpu …
の7.2あたり。

他にもこれとか、いくらでもあります。
https://atmarkit.itmedia.co.jp/ait/articles/2104 …

入門書にもたいてい載ってますよ。

使ってみれば解りますが
メチャクチャ簡単です。
    • good
    • 0

こんなに無関係な質問を一つの 質問にぶち込むと


答えるのが大変なんで、答える人が減っちゃうよ。

最初のリストの件
>data[i] = [int(num) for num in line.split()]
はリストの要素にリストを代入しているのだから、
リストのリストになるのはあたりまえ。
平坦なリストにしたいなら
dataは空のリストとして作成して、splitしたものを1個1個リストに
appendするべきです。

それと、pythonは配列は可変長の動的配列しか無いので
配列のサイズを予め確保するCやBASIC
の様なかき方は異様です。とても不自然です。

違和感はその辺から来ているのかも知れないけど
動的配列(リスト)の意味をもう少し理解した方が
良いかもしれません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。すみません、質問がいろいろ飛んでいるようなのですが、現場は1つです。エクセルのシートのような2次元的な広がりを持ったデータをpythonで読み込んで2次元配列に確保するということでした。多次元配列はないということですが、1次元配列data(しかも動的)であったとしてもdata[3][5]のように2次元配列を呼び出すようにしてデータを取り扱うことができるようなのでそれでいいのです(そういう意味で2次元配列があるのと同じ)。

質問が飛んでいるのがリダイレクトだと思いますが、リダイレクトしないでファイル名を指定して読み込むことをしたいと思っています。ファイルを開いて、読んで、閉じる、という動作ですね(他の言語では至極簡単)。私の持っているpythonのガイド本に書いてないのでお尋ねしたのですが、ネット検索したら出てきそうではありますが。

お礼日時:2022/04/13 09:03

> data = [[] for i in range(SETSIZE)]



https://docs.python.org/ja/3/tutorial/datastruct …

要素数 SETSIZE のリストが作られます。
各要素は空のリストです。

data=[]
for i in range(SETSIZE):
  data.append([])
とほぼ同等。

Pythonの「標準」では、多次元配列は無いので、リスト、タプル等のシーケンス型の入れ子で表現するのが常套手段です。


> ファイルのセパレータ(空白とかカンマとかいろいろ)が変わった場合はどうなるでしょうか。

セパレータは指定できます。
https://docs.python.org/ja/3/library/stdtypes.ht …


> python abc.py < data.in で"data.in"というファイル指定します。

「標準入力 リダイレクト」で検索を。

< を使った入力ファイルの指定は、別に変わったことではありません。
これは、Pythonの機能ではなく、OS(とシェル)の機能です。
そのため、C言語等の他の言語でも同じことができます。
よく入門書に「scanfで『キーボード』から入力」などとあったりしますが、正確には「scanfで『標準入力』から入力」 + 「『標準入力』は通常キーボード入力に割り当てられている」です。

> ソース内にフルパスで読み込みファイル指定をした場合、どのようなコードになるでしょうか。

下記チュートリアル等、解説しているサイト、参考書はたくさんあるので確認しましょう。

https://docs.python.org/ja/3.11/tutorial/inputou …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。pythonでは多次元配列という考え方はなく、かつ常に動的である(あらかじめサイズを決めない)、ということですね。
動的ということであれば他の言語でもありますが、上限はあるはずですが、それを意識しないでプログラムを書くという風になっていると理解したいと思います。私としてはこれまで必要なメモリを確保してその中で仕事をする、という習慣でやってきたので違和感がありましたが。

標準リダイレクトは標準入力として受けるということですね。ただリダイレクトしないものもありますね。
python abc.py data.in
というものです。argv[]などで受け取るのでしょうか。

pythonの教科書は出版の数が大変多いのですが、私が見ている本(結構分厚い)には所望の機能が触れられておらずどうなってるのかなということだったのです。

お礼日時:2022/04/13 08:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!