我的目录是[parentid, name]
,如下所示:
D = {0: [-1, 'C:'],
1: [0, 'BLAH'],
2: [0, 'TEMP'],
3: [1, 'BOOO'],
4: [1, 'AZAZ'],
5: [2, 'ABCD']}
我想从这个走向完整的道路:
FULLPATHS = {}
for key, path in D.iteritems():
newpath = path[1]
if path[0] != -1:
newpath = FULLPATHS[path[0]] + '\\' + newpath
FULLPATHS[key] = newpath
有效:
{0: 'C:', 1: 'C:\\BLAH', 2: 'C:\\TEMP', 3: 'C:\\BLAH\\BOOO', 4: 'C:\\BLAH\\AZAZ', 5: 'C:\\TEMP\\ABCD'}
但是现在,如果密钥是非增加的目录ID,则会出现棘手的部分:
D = {0: [-1, 'C:'],
7: [0, 'TEMP'],
3: [122, 'BOOO'],
4: [122, 'AZAZ'],
5: [7, 'ABCD'],
122: [0, 'BLAH']}
在NTFS MasterFileTable(我正在阅读)中经常是这样的。
这个想法可能是:"当到达3: [122, 'BOOO']
时,让我们等待并推迟这一个以后,一旦dir#122将在稍后处理" 。但这需要许多连续的循环来确保一切都正确完成。
如何从[parentid, name]
目录方案转到完整路径?
注意:此问题并非特定于Python,因此我不是在寻找os.path
解决方案,而是一般性问题。
答案 0 :(得分:1)
一种可能性:每个元素都会上链,直到你到达root。
FULLPATHS=dict()
for k in D:
parent = D[k][0]
chain = [ D[k][1] ]
while parent != -1: # here I assume root's parent is always -1
chain.append(D[parent][1])
parent = D[parent][0]
FULLPATHS[k] = '\\'.join(reversed(chain))
甚至利用已经建立的前缀路径:
FULLPATHS = { 0: 'C:' }
for k in D:
i = k
chain = []
while i not in FULLPATHS:
chain.append(D[i][1])
i = D[i][0]
FULLPATHS[k] = '\\'.join([FULLPATHS[i]] + list(reversed(chain)))
print(FULLPATHS)
答案 1 :(得分:0)
我正在尝试这样的解决方案:如果父母尚未“完整路径”,请先执行此操作,一次性完成!
FULLPATHS = {0: 'C:'}
def do(id):
parentid = D[id][0]
name = D[id][1]
if id not in FULLPATHS:
if parentid not in FULLPATHS:
do(parentid)
FULLPATHS[id] = FULLPATHS[parentid] + '\\' + name
for k, v in D.iteritems():
do(k)
print FULLPATHS
#{0: 'C:', 3: 'C:\\BLAH\\BOOO', 4: 'C:\\BLAH\\AZAZ', 5: 'C:\\TEMP\\ABCD', 7: 'C:\\TEMP', 122: 'C:\\BLAH'}