我有两个合并到字典中的列表
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 :(得分:3)
除非您明确设置值,否则您的值将在 fromkeys 中设置为无:
fromkeys(seq [,value])
使用seq中的键创建一个新字典,并将值设置为value。 fromkeys()是一个返回新字典的类方法。值默认为无。
在您的情况下,您需要创建列表作为每个键的值:
d = {k:[] for k in keys}
你也可以使用dict进行检查:
d = {k:[] for k in keys}
for test in tests_available:
k = tests.split('_', 1)[0]
if k in d:
d[k].append(test)
您可以传递一个值来使用 fromkeys ,但它必须是 immutable ,否则您将在所有键中共享相同的对象。
答案 1 :(得分: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
答案 2 :(得分: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']}