2013-08-01 157 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