2016-09-20 44 views
1

我需要把一個路徑到Python字典,其中parent folder = keyfolder content = values (e.g 'a/foo' 'a/bar' 'b/root' 'b/data'需要爲{ 'a': ['foo', 'bar'], 'b': ['root', 'data']})我有我的字典初始化d = {'a': [], 'b': [] }和我的價值觀的列表中添加多個值l = ['a/foo', 'a/bar', 'b/root', 'b/data']每個鍵的字典取決於if語句

我做了一個嵌套的循環與if語句誰需要有句哪個值應分配給密鑰和刪除值路徑,所述鍵(例如,「一個/根」變爲「根」)

for key in d: 
    myIndex = len(key) 
    for value in l: 
     if value[:myIndex] == key: 
      d[key].append(value[myIndex+1:]) 
的護理

問題是我得到了r中的值ight格式免除我爲每個鍵{ a: ['foo', 'bar', 'root', 'data'], b: ['foo', 'bar', 'root', 'data'] }獲得所有這些,就好像我的if語句被忽略一樣。如果有人有這個問題的想法!由於

+2

我的猜測是,你是初始化兩個關鍵條目,並引用同一個空列表 – samgak

+0

在我的機器上可以正常工作([Imgur](http://imgur.com/a/pKtGW))。看起來你的問題與你實際做的不一樣,或者你的Python有問題。 – Jeon

回答

1

考慮你的結果的結構,collections.defaultdict可以處理這個更容易:

from collections import defaultdict 

d = defaultdict(list) 

lst = ['a/foo', 'a/bar', 'b/root', 'b/data'] 

for path in lst: 
    k, v = path.split('/') 
    d[k].append(v) 

print(d) 
# defaultdict(<class 'list'>, {'b': ['root', 'data'], 'a': ['foo', 'bar']}) 
+1

可能使用'k,v = os.path.dirname(path),os.path.basename(path)' –

+0

@Chris_Rands更通用 - 可以,這可能是多結構化路徑的一個泛化。好的! –

+0

工作像魅力謝謝先生 – MathiasH

0

使用split拆分到文件夾和子文件夾。

d = {'a': [], 'b': [] } 
l = ['a/foo', 'a/bar', 'b/root', 'b/data'] 
for key in d: 
    for value in l: 
     sep = value.split('/') 
     if key == sep[0]: 
      d[key].append(sep[1]) 
print(d) 
# {'b': ['root', 'data'], 'a': ['foo', 'bar']} 
0

你有你初始化你的字典customersDatabases的方式有問題:

相反的:

customersDatabases = d # problem with keys initialization (pointer to same empty list) 

嘗試:

customersDatabases = dict(d) # new instance properly initialized