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

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

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

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

Q&A

解決済

2回答

566閲覧

多次元データの扱いについて

kiiti_shiraishi

総合スコア14

Python

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

0グッド

0クリップ

投稿2021/10/28 02:38

前提・実現したいこと

3次元のlist BoardDataを'a'に初期化して BoardData([0][0][0])をプリントしようと思いました。
しかしBoardData([0][0][0] = 'a' が function call とみなされているようです。
どこが悪いのか見当がつきません。よろしくお願いいたします。

デバッグ中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

File "c:\Users\shiraishikiichi\pytext\xmltoArray.py", line 12 BoardData([d1][d2][d3]) = 'a' ^ SyntaxError: cannot assign to function call

該当のソースコード

python

1from os import dup2 2import tkinter as tk 3import tkinter.filedialog as fd 4 5d1 = 0 6d2 = 0 7d3 = 0 8 9while d1 < 64: 10 while d2 < 5: 11 while d3 < 4: 12 BoardData([d1][d2][d3]) = 'a' #line12 13 d3 += 1 14 d2 += 1 15d1 += 1 16 17print(BoardData[0][0][0]) 18ソースコード

試したこと

なにも試していません。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

guest

回答2

0

ベストアンサー

質問への回答はTakaiYさんの書かれている通りですが、その回答のコメントに対して。

numpyを使えばわりと簡単に定義出来そうですが、これは数値のみで文字は扱えなさそうです。

numpyで文字列を扱うことはできます。
numpyの良さをより発揮できるのは数値の配列というだけです。

dtypeがobjectのarrayを作ればいいです。
固定長の文字列でいいなら、dtype='U10'とかdtype='S10'とかも使えます。
(https://numpy.org/doc/stable/reference/arrays.dtypes.html)

python

1import numpy as np 2 3BoardData = np.empty((64, 5, 4), dtype=object) 4BoardData[:] = 'a' 5 6# 初期値で全部を埋めるなら下記でも可 7# BoardData = np.full((64, 5, 4), 'a', dtype=object)

リストにしたければ、BoardData = BoardData.tolist()で多重リストに変換もできます。

投稿2021/10/28 08:54

bsdfan

総合スコア4794

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

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

kiiti_shiraishi

2021/10/28 10:38

ありがとうございました。numpyで文字列の配列を定義出来そうなことは判りました。 使うことが出来る配列を定義するコーディグはこれからエラー&リトライで作ってみます。 行きずまったら再度質問しますのでよろしくお願いいたします。
guest

0

変数の後にカッコ"()"があれば、それは関数呼び出しとみなされます。

そのカッコは不要ではないでしょうか。

python

1BoardData[d1][d2][d3] = 'a'

投稿2021/10/28 03:40

TakaiY

総合スコア13790

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

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

kiiti_shiraishi

2021/10/28 03:59

ありがとうがざいます。 ()を外したところ、 同じ行で NameError: name 'BoardData' is not defined とエラーが発生しました。 確かに」参考書にも()はついていませんでした。
kiiti_shiraishi

2021/10/28 04:17

ソースコードline12のBoardData にカーソルを当てると 「"BoardData" is not definedPylancereportUndefinedVariable BoardData: Any 問題の表示  利用できるクイックフィックスはありません」 と表示が出ます。
TakaiY

2021/10/28 06:24

このソースだけで動かせばそのとおりの結果になりますよ。 その「参考書」にこのソースが書いてあるのだとすれば、それは間違えています。 いきなり「BoardData[d1][d2][d3] = 'a'」と書いても、配列は作られません。 「参考書」の内容を確認すると同時に、pythonプログラムの基本的な書き方を勉強される必要があると思います。
kiiti_shiraishi

2021/10/28 06:54

ありがとうがざいます。 参考書によれば64X5X4の文字の全要素に文字を定義する方法はあります。 しかしこれだけをソースに書く気にはなれません。1300文字くらいになります。 numpyを使えばわりと簡単に定義出来そうですが、これは数値のみで文字は扱えなさそうです。 VBでは dim BoardData(63,4,3) As string で簡単に定義出来ます。 python でもこのように簡単に定義出来ないのでしょうか。
TakaiY

2021/10/28 07:56

> 参考書によれば64X5X4の文字の全要素に文字を定義する方法はあります というのは「BoardData[d1][d2][d3] = 'a'」のことですか?であれば、元の配列の初期化の方法も書いてあるはずですけど。 書いているとおり「dim BoardData(63,4,3) As string」に相当する処理です。 pythonでの多次元配列の初期化については、こんなに簡単ではありませんが、 https://note.nkmk.me/python-list-initialize/ このあたりが参考になると思います。 ちなみに、1300文字 もあるデータの配列を作るのであれば、ファイルからcsvのような形で読み込んだほうがいいと思いますよ。
kiiti_shiraishi

2021/10/28 10:30

ありがとうがざいます。私が参考書を見て分かったのは、配列に実際に値を指定する方法です。 データはxmlファイルから読み込むので入れ物として文字列を格納できる配列が定義出来ればよかったのです。 質問のソースは文字型の配列を作るためのものでした。最終目的が記載されていない質問になり申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問