我正在尝试运行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”运行另一个for循环。我得到的错误是
TypeError:'int'对象不可迭代
答案 0 :(得分:5)
如果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
因此,当将它分配给年龄变量时,Python'解包'一个1元素的元组会发生什么。正如您所期望的那样,年龄而不是(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
答案 1 :(得分:2)
你的元组中只有一个int的元组被解析为int而不是元组。因此,当您尝试使用年龄中的项目时 - 您正在尝试迭代不可迭代的项目。使用列表[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 :(得分:0)
我不想这么说,但是sihrc和piokuc都错了。
您有一个格式字典:
d = { (1,2,3) : "a",
(4) : "b"
}
第一个键(1,2,3)
是一个包含3个整数的元组。第二个键(4)
只是一个值为4的整数,不是一个元组。元组的定义特征是分隔值而不是大括号的逗号,因此a = 1,2,3
创建一个元组,并将其分配给a
。
围绕元组的大括号的主要目的是使代码看起来更清晰,并简化一些边缘情况,例如单项元组。
要将4转换为单个项目元组,您需要做一些有点奇怪的事情,在值之后添加一个尾随逗号,即(4,)
。
如果对字典中的所有单项键执行此操作,您应该会发现它可以正常工作。
答案 3 :(得分: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
有关详细信息,请参阅the docs。