"Int"对象不可迭代。

4

我正在尝试运行一个for循环。这是我代码中出现问题的部分:

aldurstengd_ororka = {(18, 19, 20, 21, 22, 23, 24):1, (25):0.95, (26):0.90,
    (27):0.85, (28, 29):0.75, (30, 31):0.65, (32, 33):0.55, (34, 35):0.45,
    (36, 37):0.35, (40, 41, 42, 43, 44, 45):0.15, (46, 47, 48, 49, 50):0.10,
    (51, 52, 53, 54, 55):0.075, (56, 57, 58, 59, 60):0.05, (61, 62, 63, 64,
    65, 66):0.025}

for age in aldurstengd_ororka.keys():
    for item in age:
       if ororkualdur == item:
           baetur = baetur + ororkulifeyrir * aldurstengd_ororka([age])

我的意图是运行aldurstengd_ororka,对于字典中的每个“age”元组,我会再次运行另一个循环以处理元组内的每个“item”。 我所遇到的错误是:

TypeError:'int' object is not iterable


如果您添加使用的编程语言标签,将会很有帮助。 - Nir Alfasi
@alfasin 看起来像是 Python。 - sdamashek
4个回答

7
如果 aldurstengd_ororka 是一个字典,那么这个表达式:
aldurstengd_ororka([age])

出现了一个错误。也许你的意思是:

aldurstengd_ororka[(age)]

编辑:你看到的错误非常有趣,我使用这个片段重现了它:

for age in aldurstengd_ororka.keys():
    print 'age:', age 
    for item in age:
        print item

代码的输出结果为:
age: (32, 33)
32
33
age: (36, 37)
36
37
age: (51, 52, 53, 54, 55)
51
52
53
54
55
age: (61, 62, 63, 64, 65, 66)
61
62
63
64
65
66
age: (30, 31)
30
31
age: 25
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/home/ma/mak/Documents/t.py in <module>()
      3 for age in aldurstengd_ororka.keys():
      4     print 'age:', age
----> 5     for item in age:
      6         print item
      7 

TypeError: 'int' object is not iterable

因此,当将一个元素的元组分配给变量age时,Python会“解包”它。因此,age不是像您期望的那样是(25),而只是25...这有点奇怪。一个解决方法是这样做:
for age in aldurstengd_ororka.keys():
    # if not tuple, make it a tuple:
    if not type(age) == type( (0,1) ): age = (age,)
    print 'age:', age 
    for item in age:
        print item

也适用于我..(!)在提交我的问题之前发现了这个(有些不同的)答案。 - juggler

2

你的元组键只包含一个整数,因此它们被解析为整数而不是元组。所以当你尝试使用 "for item in age" 进行迭代时,你正在尝试迭代一个非可迭代对象。使用列表[4]或使用逗号(4,),就可以解决问题:

aldurstengd_ororka = {(18, 19, 20, 21, 22, 23, 24):1, (25):0.95, (26):0.90,
    (27):0.85, (28, 29):0.75, (30, 31):0.65, (32, 33):0.55, (34, 35):0.45,
    (36, 37):0.35, (40, 41, 42, 43, 44, 45):0.15, (46, 47, 48, 49, 50):0.10,
    (51, 52, 53, 54, 55):0.075, (56, 57, 58, 59, 60):0.05, (61, 62, 63, 64,
    65, 66):0.025}

for age in aldurstengd_ororka.keys():
    if isinstance(age, [tuple, list]):
       for item in age:
           if ororkualdur == item:
               baetur = baetur + ororkulifeyrir * aldurstengd_ororka[age]
    else:
        baetur = baetur + ororkulifeyrir * aldurstengd_ororka[age]

2
我很抱歉地说,sihrc和piokuc都是错误的。
你有一个以下格式的字典:
d = { (1,2,3) : "a",
      (4) : "b"
    }

第一个键(1,2,3)是一个包含3个整数的元组。第二个键(4)只是一个值为4的整数,而不是元组。元组的定义特征是逗号分隔值,而不是大括号,因此a = 1,2,3创建了一个元组,并将其赋给a
大括号主要用于让代码看起来更加清晰,并简化一些边缘情况,例如单个项目元组。
要将4转换为单个项目元组,您需要做一些略微奇怪的事情,在值后添加尾随逗号,例如(4,)
如果对字典中所有单个项目键都这样做,您应该会发现它可以正常工作。

0
字典的键有时是元组,有时是整数。正如@Simon Callan所提到的那样,您可以在数字之间添加逗号以使所有键都可迭代。
如果您不希望编辑字典,请使用more_itertools库中的工具,它始终返回一个可迭代对象。
简化例子:
import more_itertools as mit

d = {
    (18, 19, 20, 21, 22, 23, 24): 1, 
    (25): 0.95, 
    (26): 0.90,
    (27): 0.85, 
    (28, 29): 0.75,
}

for age in d:
    for item in mit.always_iterable(age):
        # Add logic here
        pass

# No TypeError

详情请参见文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接