[topic] フォルダパス一覧のツリー構造への変換

(相対)フォルダのパスの一覧が与えられ、そのフォルダパスの一覧をツリー構造に変換してください。
フォルダパスの区切り文字は'\'文字を使用しています。

以下のような1行1パスのフォルダのパスがあった場合、
 abc\def
 abc\def\gh
 abc\def\ij
 abc\jk\lm
 de

イメージとして、以下のようなツリー構造を構築できればOKです。
 ROOT
 ┗abc
  ┗def
   ┗gh
   ┗ij
  ┗jk
   ┗lm
 ┗de

ツリーですのでルートがあります。上記のフォルダ一覧はルート以下にぶら下げてください。また、同じフォルダにぶら下がっているサブフォルダの名前は重複させてはいけません。

上記のような出力は結果の分かりやすさとしてあった方がいいですが、なければないで構いません。また、ASやJavaFXでグラフィカルな結果を表示するプログラムでも構いませんが、データ構造はちゃんと作ってください。

Posted feedbacks - Python

擬似lsの実装は実はデータ構造の話を次にもってこようかなぁと思ってたりしていた。

一応10分くらいで実装してみた。
辞書型を使って処理してみる。

以下実行結果
-----------
 abc
  def
   gh
   ij
  jk
   lm
 azc
  def
 de
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#-*- coding: utf-8 -*-

pathList = [
"azc\\def",
"abc\\def",
"abc\\def\\gh",
"abc\\def\\ij",
"abc\\jk\\lm",
"de"]

tree = {}
for path in pathList:
    temp = tree
    for dir in path.split("\\"):
        if not temp.has_key(dir):
            temp[dir] = {}
        temp = temp[dir]
def printTree(tree, nest):
    keyList = tree.keys()
    keyList.sort()
    for key in keyList:
        print " "*nest,key
        if len(tree[key].keys()):
            printTree(tree[key], nest+1)
            
printTree(tree,0)

素直に再帰関数で実装しました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# encoding: utf-8
list = [ "abc\\def", "abc\\def\\gh", "abc\\def\\ij", "abc\\jk\\lm", "de" ]

def pathtree(lst):
  def maketree(l):
    s = [x for x in set([v[0] for v in l])]
    s.sort()
    return [[v, maketree([x[1:] for x in l if x[0]==v and len(x)>1])] for v in s]
  return ["ROOT", maketree([s.split("\\") for s in list])]

def printtree(tree):
  def printchild(tree, nest):
    for c in tree:
      if c==[]: continue
      print " "*nest*2 + "┗" + c[0]
      printchild(c[1], nest+1)
  print tree[0]
  printchild(tree[1], 0)

printtree(pathtree(list))

Index

Feed

Other

Link

Pathtraq

loading...