[topic] フォルダパス一覧のツリー構造への変換
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))
|



todogzm
#4458()
Rating1/1=1.00
フォルダパスの区切り文字は'\'文字を使用しています。
以下のような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でグラフィカルな結果を表示するプログラムでも構いませんが、データ構造はちゃんと作ってください。
[ reply ]