' NoneType'对象没有属性'追加'

时间:2016-09-23 10:09:26

标签: python

我有两个合并到字典中的列表

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'对象没有属性'追加'当它试图将值附加到键时。任何人都可以帮我识别代码中的错误吗?

3 个答案:

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