Python字典错误:str对象没有属性append

2024-06-28 19:05:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python编写代码。 我的输入行是“all/DT remaining/VBG all/NNS of/IN”

我想创建一个具有一个键和多个值的字典 例如-all:[DT,NNS]

groupPairsByKey={}
Code:
for line in fileIn:
    lineLength=len(line)
    words=line[0:lineLength-1].split(' ')
    for word in words:
        wordPair=word.split('/')
                  if wordPair[0] in groupPairsByKey:
                    groupPairsByKey[wordPair[0]].append(wordPair[1])
<getting error here>
                  else:
                    groupPairsByKey[wordPair[0]] = [wordPair[1]]

Tags: 代码inforlinedtallwordsplit
3条回答

虽然在我看来你应该得到一个缩进错误,如果你得到消息

str object has no attribute append

那就意味着

groupPairsByKey[wordPair[0]]

是一个str,并且strs没有append方法。


你发布的代码没有显示

groupPairsByKey[wordPair[0]]

可能有一个str值。也许是

if wordPair[0] in groupPairsByKey:
    if isinstance(groupPairsByKey[wordPair[0]], basestring):
        print('{}: {}'.format(*wordPair))
        raise Hell

在你的代码中帮助追查罪犯。


您还可以使用collections.defaultdict来简化代码:

import collections
groupPairsByKey = collections.defaultdict(list)
for line in fileIn:
    lineLength=len(line)
    words=line[0:lineLength-1].split(' ')
    for word in words:
        wordPair=word.split('/')
        groupPairsByKey[wordPair[0]].append(wordPair[1])

当使用缺少的键访问defaultdict时,将调用工厂函数(在本例中为list),并将返回值用作defaultdict中的关联值。因此,每当遇到丢失的密钥时,新的密钥-值对就会自动插入defaultdict。因为默认值总是一个列表,所以不会遇到错误 str object has no attribute append不再——除非你 重新分配旧键值对以获得新值(astr)的代码。

你可以:

my_dict["all"] = my_string.split('/')

在Python中

你的问题是groupPairsByKey[wordPair[0]]不是一个列表,而是一个字符串!

在将值附加到groupPairsByKey['all']之前,需要将该值设置为列表。

你的解决方案已经是正确的,在我的情况下是完美的。请确保groupPairsByKey是一个完全空的字典。

顺便说一句,我就是这么想的:

>>> words = "all/DT remaining/VBG all/NNS of/IN".split
>>> for word in words:
    wordPair = word.split('/')
    if wordPair[0] in groupPairsByKey:
        groupPairsByKey[wordPair[0]].append(wordPair[1])
    else:
        groupPairsByKey[wordPair[0]] = [wordPair[1]]


>>> groupPairsByKey
{'of': ['IN'], 'remaining': ['VBG'], 'all': ['DT', 'NNS']}
>>> 

另外,如果您的代码的格式与您在这里发布的代码的格式相同,您将得到一个indentationError。

希望这有帮助!

相关问题 更多 >