2013-08-01 3 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, и для каждого «возраста» кортежа в словаре, я бег другого цикла для каждого «элемента» внутри кортежа. Ошибки я получаю

TypeError: 'INT' объект не итерацию

+0

Это поможет, если вы добавите тег с языком программирования, которым вы пользуетесь – alfasin

+0

@alfasin выглядит как Python. – sdamashek

+0

Прости, да. Python. – KSHMR

ответ

4

Если aldurstengd_ororka является словарь, то это выражение:

aldurstengd_ororka([age]) 

ошибка. Возможно, вы имели в виду что-то вроде:

aldurstengd_ororka[(age)] 

EDIT: Ошибка вы видите, это довольно интересно, я его воспроизвести этот фрагмент кода:

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 в них в настоящее время разбирается как межд вместо кортежа. Поэтому, когда вы пытаетесь использовать элемент по возрасту, вы пытаетесь выполнить итерацию через неизменяемый. Используйте списки [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 для деталей.

Смежные вопросы