setdefault和整数的问题

1 投票
1 回答
1401 浏览
提问于 2025-04-18 18:09

我正在测试以下这个函数:

def getDataMapOfFirstLine(line):
    datamap = {}
    for item in line:
        hierarchy = item.split('^')
        partialmap = datamap
        i=0
        for node in hierarchy:
            partialmap = partialmap.setdefault(node, i)
            i += 1

    return datamap

它应该从一个csv文件的第一行创建一个字典,格式大概是这样的:

nummer;such;ans;bverb^konum;bverb^namebspr;bverb^bank^iident;
1213;HANS;Hans Dominik;111000222;Hans' account; DE2145432523534232;
1444555;DIRK;Dirk Daniel;13300002;Dirk's account; DE2134634565462352;

你可以看到这些在每个用分号分隔的字符串中的插入符号,类似于SQL中的连接操作。如果我执行这个函数,就会出现这个错误:

Traceback (most recent call last):
  File "./importtool.py", line 173, in <module>
    main()
  File "./importtool.py", line 38, in main
    analyseImportFile(importfile, parser, options)
  File "./importtool.py", line 119, in analyseImportFile
    datamap = getDataMapOfFirstLine(line)
  File "./importtool.py", line 149, in getDataMapOfFirstLine
    partialmap = partialmap.setdefault(node, i)
AttributeError: 'int' object has no attribute 'setdefault'

如果我把setdefault函数中的i替换成{},就不会出现错误:

{'bverb': {'namebspr': {}, 'konum': {}, 'bank': {'iident': {}}}, 'such': {}, 'ans': {}}

这几乎是我想要的,但我希望得到的是一个列的编号,而不是{}。

我就是搞不明白哪里出了问题。我在交互模式下试过这个:

>>> mydict = {'foo': "Hallo", 'bar': 5}
>>> mydict.setdefault("sth", 12)
12
>>> print mydict
{'sth': 12, 'foo': 'Hallo', 'bar': 5}

你看,这个是可以工作的……

我非常感谢任何帮助。提前谢谢你们!

1 个回答

2

你的问题出在这一行:

partialmap = partialmap.setdefault(node, i)

dict.setdefault 返回的是你设置的值(或者是已经存在的值)。在这个例子中,它返回的是一个整数,所以你把 partialmap 设置成了一个 int。其实你可以选择不去获取这个返回值(顺便说一下,这也是你在交互式终端中做的事情):

partialmap.setdefault(node, i)

撰写回答