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

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

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

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

Q&A

解決済

1回答

1537閲覧

親子関係のデータをグループ分けする

biginner_

総合スコア3

Python

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

0グッド

0クリップ

投稿2019/08/14 02:44

編集2019/08/14 02:48

前提・実現したいこと

親子関係が与えられているデータから、要素をグループ分けして、任意の要素がどのグループに属しているかを調査するプログラムを作りたいと思っています。

グループ分けの定義としては以下の通りです
親子関係で繋がっている末端の要素をグループ名として、そこに繋がる要素をグループの要素とする。下図のような場合以下のようなグループ分けとなる。
AーBーCーDーE

ーFーGーH

ーIーJーK

ーLーM

Eグループ:ABCD
Hグループ:ABCFG
Kグループ:ABCIJK
Mグループ:ABCILM

親子関係は以下のようなテーブルです。
Child, Parent
A,ー
B,A
C,B
D,C
E,D
F,C
G,F
H,G
I,C
J,I
K,J
L,I
M,L

試したこと

要素がどのグループに属するかについては以下のコードで調べられそうなのですが、
そもそもの親子関係のテーブルからグループわけする部分が手も足も出ないためアドバイス頂けますと幸いです。

Python3

1E=set('ABCD') 2H=set('ABCFG') 3K=set('ABCIJK') 4M=set('ABCILM') 5 6GroupDict = {'E': E, 'H': H, 'K': K, 'M': M} 7 8# Yousoがどのグループに属しているか調べる 9 10Youso = input() 11found = [] 12for k, v in GroupDict.items(): 13 if Youso in v: 14 found.append(k) 15print(Youso, 'のグループは', found) 16

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のコードでいけそうです。

Python

1# グループ=末尾の要素を取得 2def get_group( node, children, group): 3 cs = children[node] 4 5 # 子供なし=末尾 6 if not cs: 7 return group + [node] 8 9 # 子供の数だけグループがある 10 for c in cs: 11 group = get_group(c, children, group) 12 13 return group 14 15# グループ取得に必要なデータを生成 16children = dict() # キー=ノード, 値=子供たち 17table = [('A',''),('B','A'),('C','B'),('D','C'),('E','D'),('F','C'),('G','F'),('H','G'),('I','C'),('J','I'),('K','J'),('L','I'),('M','L')] 18for l in table: 19 node, parent = l[0], l[1] 20 if not node in children: 21 children[node] = [] 22 if parent: 23 children[parent].append(node) 24 25# A~Lのグループ表示 26for n in range(ord('A'), ord('M')): 27 n = chr(n) 28 print('{}->{}'.format(n, get_group(n, children, [])))

投稿2019/08/14 03:50

can110

総合スコア38262

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

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

biginner_

2019/08/14 05:13

早急に回答いただきありがとうございます。 教えていただいたコードで意図通りの結果が出せました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問