1

我正在用python编写代码。我的输入行是“all/DT剩余/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]]
4

3 回答 3

2

尽管在我看来您应该收到 IndentationError,但如果您收到消息

str 对象没有属性 append

那么这意味着

groupPairsByKey[wordPair[0]]

是 a 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缺少的键访问 a 时,将调用工厂函数(在本例list中)并将返回的值用作defaultdict. defaultdict因此,只要遇到丢失的键,就会自动将新的键值对插入到其中。由于默认值始终是一个列表,因此您将不会再遇到错误 str object has no attribute append- 除非您有代码将旧键值对重新分配str为具有新值 a 。

于 2013-10-08T01:08:34.780 回答
2

你的问题是那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。

希望这可以帮助!

于 2013-10-08T01:46:17.247 回答
1

你可以做:

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

在 Python 中,

于 2013-10-08T01:06:57.340 回答