获取'int'对象是不可迭代的

时间:2012-07-18 02:54:43

标签: python iteration

    cat_sums[cat] += value
TypeError: 'int' object is not iterable

我的意见是:

defaultdict(<type 'list'>, {'composed': [0], 'elated': [0], 'unsure': [0], 'hostile': [0], 'tired': [0], 'depressed': [0], 'guilty': [0], 'confused': [0], 'clearheaded': [0], 'anxious': [0], 'confident': [0], 'agreeable': [0], 'energetic': [0]})

这被分配给一个叫做catnums的东西

accumulate_by_category(worddict, catnums, categories)

        def accumulate_by_category(word_values, cat_sums, cats):
                for word, value in word_values.items():
                        for cat in cats[word]:
                                cat_sums[cat] += value

据我所知,我不是要迭代一个整数。我正在尝试将值添加到catnums中的另一个值。

我的accumulate_by_category()函数中的“cats”参数是否有问题?

3 个答案:

答案 0 :(得分:6)

您的每个值都是一个列表。 +运算符应用于列表时会将 iterable 添加到列表中。它不附加单个值:

>>> [1,2] + [3,4]
[1, 2, 3, 4]
>>> [1,2] + 3
TypeError: can only concatenate list (not "int") to list

看起来你想做cat_sums[cat].append(value)

答案 1 :(得分:0)

应用于列表时,

+是连接。正如BrenBarn所说,[1, 2] + [3, 4] == [1, 2, 3, 4]

但是,如果您实际上正在尝试添加数字,正如您的声明所暗示的那样“我正在尝试将值添加到catnums中的另一个值”,那么append将无法执行您想要的操作。

如果是这种情况,那么您显示的字典可能不正确。这不是单词到数字的映射;它是单词到数字列表的映射(即列表[0])。如果你想保持一个单词的数量,这不是你想要的;你想要{'composed': 0, 'elated': 0, ...}(注意缺少方括号)。然后+=语句将按预期工作。

如果您无法更改字典但只想更改列表中的数字,则可以说cat_sums[cat][0] += value。然而,简单地将“零列表”转换为普通的旧零将更有意义(如果这是你所追求的)。

答案 2 :(得分:0)

如果有人在Django模板中收到此错误,则...

当您这样做:

{% for c in cat_sums.keys %}

然后,在后台,Django模板语言首先尝试进行cat_sums['keys']查找。通常,这将失败,并且Django接下来将寻找一种方法。但是由于这是defaultdict,所以默认值将被存储。

如果字典是使用

创建的
cat_sums = defaultdict(int)

执行的是:

for c in cat_sums['keys']:

for c in 0:

由于值0不可迭代,因此正确地引发了错误。

分辨率?在上下文中传递dict(cat_sums),以便视图获得常规的dict