从[parentid,name]目录dict到完整路径dict

时间:2017-07-10 13:54:25

标签: python dictionary path filesystems

我的目录是[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解决方案,而是一般性问题。

2 个答案:

答案 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'}