Python: суммирование нечетных/четных случайных чисел генерирует ошибку типа: объект «int» не является итерируемым

Да, этот вопрос был задан, но я не могу применить ответы к своей проблеме. Эта проблема состоит из нескольких частей, и это самое большое препятствие, с которым я столкнулся.

Мне нужно создать случайный список из 10 чисел от 10 до 90. Из этих случайных чисел мне нужно суммировать суммы как четных, так и нечетных чисел.

def playlist():
    nums = []
    for nums in range(10):
        # Get random list of 10 numbers
        my_nums = random.randint(10, 90)
        print (my_nums,end=' ')
        even = []
        odd = []
        for x in my_nums:
            if x % 2 == 0:
                even.append[x]
                print(even)
            else:
                odd.append[x]
                print(odd)

Когда я запускаю это, иногда я получаю одно или два числа (обычно первые два нечетных числа), но в основном я получаю TypeError: 'int' object is not iterable.

Не буду врать — мой первый язык — PHP, а не Python, и это становится для меня огромной проблемой :(

Любая помощь приветствуется.


person Bernadette McCarthy    schedule 04.09.2016    source источник
comment
Вы пытаетесь перебрать my_nums, как если бы это был список чисел, но на самом деле это всего лишь одно целое число. Кстати, вы также определяете nums как пустой список, и уже в следующей строке вы удаляете его и помещаете в него целое число.   -  person zvone    schedule 05.09.2016
comment
my_nums — целое число. Вы не можете for-in над номером.   -  person Andrew Li    schedule 05.09.2016
comment
@zvone - я не знаю почему, но для этого требовалось задание создать пустой список с именем nums   -  person Bernadette McCarthy    schedule 05.09.2016
comment
@andrew-l - я изменил x в my_nums на x в диапазоне (my_nums), и это остановило эту ошибку - теперь я просто печатаю нечетные и четные числа между 0 и 9, лол   -  person Bernadette McCarthy    schedule 05.09.2016


Ответы (6)


Создание списка с рандомами

n = [random.randint(10,90) for x in range(10)]

Получение чета и шансов:

even = [x for x in n if x % 2 == 0]
odd = [x for x in n if x % 2 == 1]
person Take_Care_    schedule 04.09.2016

Вы должны делать это.

def playlist():
    nums1 = []
    for nums in range(10):
        # Get random list of 10 numbers
        my_nums = random.randint(10, 90)
        nums1.append(my_nums)
        print my_nums


    even = []
    odd = []
    for x in nums1:
      if x % 2 == 0:
          even.append(x)
          print(even)
      else:
          odd.append(x)
          print(odd)


playlist()
person Annapoornima Koppad    schedule 04.09.2016
comment
действительно?, удалите оператор печати, я понимаю, что это за ошибка, которую вы получаете? - person Annapoornima Koppad; 05.09.2016
comment
Извините за отступ, это было немного не так. Теперь все должно работать нормально. - person Annapoornima Koppad; 05.09.2016
comment
после того, как вы закончите писать функцию, вызовите ее где-нибудь. В конце скрипта введите имя функции. Это должно делать свое дело. - person Annapoornima Koppad; 05.09.2016
comment
да, сотрите мой предыдущий комментарий ... Я также забыл импортировать случайный, этот список печатается, но я получаю 21 30 46 10 10 71 47 42 84 53 Traceback (последний последний вызов): Файл C: \ Users \ Bernadette \ Desktop\0520 Intermediate Computer Programming\program_p1.py, строка 21, в плейлисте ‹module› () Файл C:\Users\Bernadette\Desktop\0520 Intermediate Computer Programming\program_p1.py, строка 18, в списке воспроизведения нечетный.append[x ] TypeError: объект 'builtin_function_or_method' не поддерживает подписку - person Bernadette McCarthy; 05.09.2016
comment
о, подожди - подожди! Я переключил even.append[x] на even.append(x) и получаю гораздо лучший результат - person Bernadette McCarthy; 05.09.2016
comment
большое спасибо за то, что указали мне правильное направление! пожалуйста, посмотрите мой ответ ниже, чтобы увидеть, как это, наконец, разыгралось :) - person Bernadette McCarthy; 05.09.2016
comment
Если пользователь помог вам, рассмотрите возможность принятия его ответа :) - person Andrew Li; 05.09.2016
comment
@BernadetteMcCarthy, не могли бы вы проголосовать и принять ответ, если ответ вам помог. - person Annapoornima Koppad; 05.09.2016

Есть несколько вещей, которые вы, кажется, неправильно поняли:

  • range(10) will give you (something that looks like) this list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].
    • You can use it with a for-loop to do something 10 times
  • random.randint(10, 90) даст вам одно случайное число от 10 до 90 (не список)

С помощью этой информации мы можем изменить ваш скрипт на:

import random

even_sum = 0
odd_sum = 0
for number_of_turns in range(10):
    # Get a random number
    number_this_turn = random.randint(10, 90)
    print(number_this_turn,end=' ')
    if number_this_turn % 2 == 0:
        even_sum += number_this_turn
        print("Sum of even numbers so far:", even_sum)
    else:
        odd_sum += number_this_turn
        print("Sum of odd numbers so far:", odd_sum)

print("Final sum of even numbers:", even_sum)
print("Final sum of odd numbers:", odd_sum)

Но мы можем сделать лучше. Вы узнаете, что в Python вам очень часто потребуется определить список (или итерацию) с нужными вам терминами, а затем что-то делать с каждым термином. Таким образом, мы можем изменить ваш сценарий на:

import random

even_sum = 0
odd_sum = 0

random_numbers = [random.randint(10, 90) for x in range(10)]

for number in random_numbers:
    print(number,end=' ')
    if number % 2 == 0:
        even_sum += number
        print("Sum of even numbers so far:", even_sum)
    else:
        odd_sum += number
        print("Sum of odd numbers so far:", odd_sum)

print("Final sum of even numbers:", even_sum)
print("Final sum of odd numbers:", odd_sum)

random_numbers = [random.randint(10, 90) for x in range(10)] использует понимание списков для создания списка из 10 случайных числа. Затем вы можете выполнить цикл for для каждого из этих чисел, где вы можете добавить к сумме четных или к сумме шансов.

Вы даже можете упростить его еще больше, как в ответе @Take_Care_, но я думаю, вам нужно многому научиться, прежде чем вы достигнете этого уровня.

person EvensF    schedule 04.09.2016
comment
Я ценю это @evensf - я совершенно не знаком с Python, хотя это компьютерное программирование среднего уровня, я только что прошел вводный класс, и даже в PHP я все еще склонен прибегать к своим процедурным методам - ​​и кажется, что каждый день я уходить все дальше и дальше от реального практического кодирования :( - person Bernadette McCarthy; 05.09.2016
comment
Прежде чем вы достигнете этого уровня, ах, вы так добры ко мне :) получить плюс. - person Take_Care_; 16.05.2017

Как упоминалось в комментариях, вы не можете писать for x in, за которым следует число. Я думаю, вам нужно for x in range(my_nums), а не for x in my_nums.

person Matt    schedule 04.09.2016
comment
да, переключение на диапазон (my_nums) исправило эту ошибку - person Bernadette McCarthy; 05.09.2016
comment
но тогда range(my_nums) не будет случайным целым числом, не так ли? - person Annapoornima Koppad; 05.09.2016

Это в конечном итоге то, что мне нужно:

def playlist():
nums = []
for nums1 in range(10):
    # Get random list of 10 numbers
    my_nums = random.randint(10, 90)
    nums.append(my_nums)
    print (my_nums,end=' ')


even = []
odd = []
for x in nums:
  if x % 2 == 0:
      even.append(x)
  else:
      odd.append(x)
print ("\n")
print("Total of Even Numbers: ",sum(even))
print ("\n")
print("Total of Odd Numbers: ",sum(odd))

Спасибо всем за помощь... да, я знаю, что отсутствует вызов для запуска функции - как я уже сказал, это всего лишь одна часть программы :)

person Bernadette McCarthy    schedule 04.09.2016

Следующий код работает:

"""
I need to generate a random list of 10 numbers between 10 & 90. From those random numbers, I need to sum the totals of both the even and odd numbers.
"""
from random import randint

    MIN = 10
    MAX = 90
    sum_odds = sum_evens = 0

    for i in range(10):
        r = randint(MIN,MAX)
        if r % 2:
            sum_odds += r
        else:
            sum_evens += r
    return sum_evens, sum_odds
person boardrider    schedule 05.09.2016