プロが教えるわが家の防犯対策術!

変数の中に複数の変数が入っていて、その変数にも更に変数が入っています。その中にも更に変数が。
上記状況で一番上位の変数から、全ての変数の内容確認と辿った階層数の二つを取得したいです。(イメージ的にはディレクトリを辿る感じに近いです)
できればPythonで教えて頂きたいですが、違う言語でも考え方を教えて頂ければ助かります。

A 回答 (9件)

名前でアクセス という話からは離れてしまうけど


データ構造の中を巡回して個々のノードを処理する
ためのプログラムの骨格にはGOFのVisitorパターン
が知られてます。

この通りに書く必要はないのだけど、いろいろ考えさせる
ところが有って、参考になりますよ。

ネット上に無数に解説が有るし、書籍も沢山でてますが
これは一例。
https://refactoring.guru/ja/design-patterns/visi …
    • good
    • 0

#6 にある「『変数』の実現方法」として辞書を使う言語もあるから, そのような実装方法を使えばここでいっている話も簡単になると思うんだ. そもそもこんなことをするなら「『変数名』も動的に変化する」ことを想定すべきだし, そうであるなら (なんらかの方法で) 辞書を使うというのはむしろ自然な発想だろう.



なお C にしろ C++ にしろ「実行時にオブジェクトの属性名情報を保持しません」という規定は存在しない>#7. そもそもそれは「言語の実装方法」であって「言語そのもの」と区別して考えるべきものなのだ.
    • good
    • 0

例えば


class A:
 def __init__(self,a=None,b=None):
  self.a = a
  self.b = b
となっていて
a = A(A(1,2),A(3,4))
なときに、a.a.aとかを辿るのはPythonだとdirを使えばできなくはないです。Pythonはオブジェクトの属性を内部的に名前をキーとした辞書で持っているので。
ただdirで得られるのは属性だけでなくクラスのメソッドやPython実行系が内部的に使っている関数などもあるので一筋縄ではいきませんけど。
なおpywin32(win32com)が内部でCOMを呼び出しているようにdirで全ての属性・関数等がリストできない場合もあるので、完全な処理は難しいです。
Pythonでプログラムを書いていてライブラリの内部データ構造を追いたいときなど苦労しています。
ちなみにC++言語などは実行時にオブジェクトの属性名情報を保持しませんのでデバッガなどで別途ソースコードの情報を管理していないと実行時に追いかけるのは無理です。
    • good
    • 0
この回答へのお礼

ご丁寧に解説ありがとうございます。
構造を追うのは難しいのですね。
お送り頂いたコードを調べて参考にさせて頂きます。

お礼日時:2023/03/05 11:41

蛇足だけど


データ構造の中で、データに名前と関連付けることを
「変数」とは全然言わないので注意してほしい。

「変数」の実現方法は言語によって大きく異なるし
変数を変数名で動的に検索出来る言語は少ない。
    • good
    • 0
この回答へのお礼

ありがとうございます。
今後表現に注意します。
変数名を動的に検索できる言語は少ないんですね。

お礼日時:2023/03/05 11:43

話が漠然としてきましたね。


名前付で木構造を作る手法としては
pythonでは属性と辞書が基本。
他にも名前付きタプルとか沢山あり、目的と使い方は其々違います。

私の示せるのはアルゴリズムの骨格くらい。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
皆さんから頂いた回答を参考に、色々と調べて試してみます。

お礼日時:2023/03/05 09:56

辞書の入れ子で階層作りたいって話なのかな?



def dive(obj, key="", level=0):
 if isinstance(obj, dict):
  for key in obj.keys():
   dive(obj[key], key, level+1)
 else:
  print(level, key, obj)

objj = {"a": 1, "b": "abc", "c": {"d": 2, "e": "ff"}}

dive(objj)

インデントは全角空白で書いてあるので
半角空白4つとかに変換しないと動きません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
辞書にこだわりはありません。
また階層を作りたいのではなく、階層を辿りたく投稿させて頂きました。

先の説明で追加補足させて頂きます。
AはB+Cで構成されています。
これを特定の機能(関数?)で、A = ['B','C']として取得します。
BはD+E+Fで構成されおり、こちらも同様の関数で B = ['D','E','F']
として取得、Cも同様の構成をしており同じような内容で取得。またその配下にあるD、E、Fやその配下にあるものも全ての要素がなくなるまで同様の方法で辿って情報を取得したいと思っています。
ちなみに構成及び階層は状況により変化する事を前提としています。

初回のAの要素は特定の関数で当然取得できますが、取得した要素に対して同様の関数を使用してそれを構成する要素を取得し、更にその取得した要素に対して同様の関数で要素を取得を繰り返し処理で階層を辿り、その階層数と内容を取得したいのですが方法がわかりません。

説明が足りないかも知れませんが、何かアドバイスいただけると助かります。

お礼日時:2023/03/04 22:54

文章はあいまいにならないように書こう.



例えば「Aの変数の中にはBとCといった文字情報が入っており」では少なくとも
・「A の変数」ってなに? 「変数A」とはどう違う?
・「BとCといった文字情報」とはどのようなもの? 「文字列」ではなく「文字情報」と書いているということは, もちろんその「文字情報」というのは「文字列」ではないんだよね? どのようなもの? そして, その「B と C といった文字情報」とやらと「B の変数」とやらには, どのような関係がある?
という疑問がある.

そもそもなんでそんな構造になっている? どうして辞書じゃダメなの?
    • good
    • 0
この回答へのお礼

「A の変数」=「変数A」という認識で問題ありません。

説明がわかりづらかったようですので再度追加します。

AはB+Cで構成されている。A = ['B','C']
BはD+E+Fで構成されている。B = ['D','E','F']
Cも上記同様で異なる構成となっている。
DもEもFも同様。
この状況でAを構成するすべての内容と階層を取得するのが目的です。
(構成要素は変動します)

製品で例えれば、以下のようなイメージ
製品AはモジュールBとモジュールCの組み合わせで構成されている。
モジュールBは、部品DとEとFで構成されている。
モジュールCは…で構成されている。
部品Dは…で構成されている。
製品Aを構成しているすべての内容を取得したいのです。

製品A
  L モジュールB
       L 部品D
          L …
          L …
       L 部品E
          L …
       L 部品F 
  L モジュールC
       L 部品…
       L 部品…
  L モジュール…

製品を例にしましたが組織図でもイメージがつくかと思います。
やりたいことは最上位を構成する要素をすべて取得したいです。
要素は変動するものですが、辞書でそのようなことができるのでしょうか。

お礼日時:2023/03/04 13:16

「変数の中に複数の変数が入っていて、その変数にも更に変数が入っています。

その中にも更に変数が。」って, どのような状況なの?

そのような状況を, あなたはどのようにして作った?
    • good
    • 0
この回答へのお礼

正しくは変数ではありません。
Aの変数の中にはBとCといった文字情報が入っており、Bの変数にはDとEとFの文字情報が、Cの変数には…といったような状況でAからその中に入っている情報をすべて取り出したいのです。
ディレクトリを走査するイメージと似ているかと思いますが、ディレクトリの関数でお答えいただくと困るため、変数の中に変数がといった表現をしました。

お礼日時:2023/03/04 08:26

こんなイメージ?



def dive(level, obj):
 iterable = hasattr(obj, "__iter__")
 isSingleChar = isinstance(obj, str) and len(obj) == 1
 if iterable and not isSingleChar:
  for ele in obj:
   dive(level+1, ele)
 else:
  print("level = " + str(level), obj)

python では文字列は iterater で辿ると無限階層になってしまうので
文字を一文字に分解したところまでで止めてます。
    • good
    • 0
この回答へのお礼

早速の回答、ありがとうございます。
Pythonを始めたばかりで内容が理解できないのですが、今から調べて確認してみます!

お礼日時:2023/03/03 18:10

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