2016-09-23 177 views
0

我有兩個列出了我融合成一個字典「NoneType」對象有沒有屬性「追加」

keys = ['p2p', 'groupchat'] 
tests_available = ['p2p_1', 'p2p_2', 'p2p_3', 'groupchat_1', 'groupchat_2'] 

預期結果會像

{'p2p': ['p2p_1', 'p2p_2', 'p2p_3'], 'groupchat': ['groupchat_1', 'groupchat_2'] 
} 

我的代碼來創建字典在下面。

out = {} 
out = dict.fromkeys(keys) 

for tests in tests_available: 
    if tests.split('_')[0] in keys: 
     key = tests.split('_')[0] 
     out[key].append(tests) 

然而,它引發錯誤「NoneType」對象有沒有屬性「追加」時,它試圖將值追加到的關鍵。任何人都可以幫助我確定我的代碼中有什麼問題嗎?

+0

你的字典最初是空的相對於它的項目,你試圖編譯一個字典列表作爲值,但沒有該列表的列表,因此錯誤,所以你可以使用默認字典默認值是空列表或檢查密鑰是否存在,並在密鑰不存在的情況下創建列表 – EdChum

回答

3

如果使用defaultdict然後追加通話將作爲價值輸入默認的列表:

In [269]: 
from collections import defaultdict 
keys = ['p2p', 'groupchat'] 
tests_available = ['p2p_1', 'p2p_2', 'p2p_3', 'groupchat_1', 'groupchat_2'] 
d = defaultdict(list) 
for test in tests_available: 
    k = test.split('_')[0] 
    if k in keys: 
     d[k].append(test) 
d.items() 

Out[269]: 
dict_items([('p2p', ['p2p_1', 'p2p_2', 'p2p_3']), ('groupchat', ['groupchat_1', 'groupchat_2'])]) 

請參閱該文檔:https://docs.python.org/2/library/collections.html#defaultdict-examples

+0

這可能會添加不需要的新鍵/值對。 –

+0

@PadraicCunningham啊是的,它不是測試'keys'的會員資格,將更新謝謝 – EdChum

+0

我打算建議相同的,但沒有像OP似乎檢查特定的鍵,雖然這可能只是如何碰巧遇到了這個問題。無論如何,它可能實際上是他們想要的。 –

3

你的值設置爲fromkeys除非您已明確設定值:

fromkeys(SEQ [,值])

創建從序列密鑰的新字典並將值設置爲值。 fromkeys()是一個返回新字典的類方法。值默認爲None。

你的情況,你需要創建列表的價值爲每個鍵:

d = {k:[] for k in keys} 

for test in tests_available: 
    k = tests.split('_', 1)[0] 
    if k in d: 
     d[k].append(test) 

您可以傳遞一個值:

d = {k:[] for k in keys} 

您還可以,如果使用dict檢查做你的使用來自的,但它必須是不可變的或者您將在所有密鑰中共享相同的對象。

1

對於一個小數字鍵/測試一個字典解析會工作,以及:

keys = ['p2p', 'groupchat'] 
tests_available = ['p2p_1', 'p2p_2', 'p2p_3', 'groupchat_1', 'groupchat_2'] 
out = {k: [v for v in tests_available if v.startswith(k)] for k in keys} 

演示:

>>> out 
{'groupchat': ['groupchat_1', 'groupchat_2'], 'p2p': ['p2p_1', 'p2p_2', 'p2p_3']} 
相關問題