2013-08-01 156 views
2

我试图运行for循环。这里是我的代码,我遇到的麻烦的部分:“Int”对象不可迭代

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运行,并在字典中的每个“年龄”的元组,我再跑for循环每一个“项目”在元组内部。我得到的错误是

类型错误:“诠释”对象不是可迭代

+0

如果您使用您正在使用的编程语言添加标签 – alfasin

+0

@alfasin看起来像Python,这将有所帮助。 – sdamashek

+0

对不起,是的。蟒蛇。 – KSHMR

回答

4

如果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 
+0

谢谢!真的很感激它。 – KSHMR

+0

不客气。 – piokuc

+0

也为我工作。(!)在提交我自己的(有些不同的)问题之前发现了这个问题。 – juggler

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] 
+0

谢谢! :)这解决了这个问题。 – KSHMR

0

我讨厌这样说,但两者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 

详见the docs