Проблемы при использовании sum. TypeError: объект ‘int’ не является итеративным

#python #python-3.x #list #sum #tuples

#python #python-3.x #Список #сумма #кортежи

Вопрос:

Я получаю сообщение об ошибке при добавлении двух значений 5 и 5. Я хотел бы получить результат 10. Я написал код на основе кортежей, это привело меня к некоторым предыдущим ошибкам, потому что его нельзя добавить, например,

 sum_A = sum (count_A)
 

потому что я получил сообщение об ошибке

TypeError: неподдерживаемые типы операндов для : ‘int’ и ‘tuple’

Поэтому я решил это с sum(int(row[0]) помощью for the row in count_gol_fact_home_sqA . Мне это не очень понравилось. Я не хочу использовать sum_A = sum (int (row [0]) для строки в count_A)

Однако я продолжил, но столкнулся с ошибкой, которая не заставляет меня добавлять sum_A и sum_B.

Как я могу добавить sum_A и sum_B? Есть ли другой способ упростить написание моего кода, предварительно добавив sum_A = sum (count_A) его без получения ошибок?

 #ELEMENT 1
cursor.execute('SELECT City FROM Nation WHERE X = ?', [X])
count_A = cursor.fetchall() #Print [(2,), (1,), (2,)]

sum_A = sum(int(row[0]) for row in count_A) #print 5
print(sum_A)
###########################################

#ELEMENT 2
cursor.execute('SELECT City FROM Nation WHERE Y = ?', [Y])
count_B = cursor.fetchall() #Print [(3,), (2,)]

sum_B = sum(int(row[0]) for row in count_B) #print 5
print(sum_B)
###########################################

SumA_B = sum(sum_A, sum_B) 
print(SumA_B) #ERROR: I would like to get result 10
 

Ошибка:

 Traceback (most recent call last):
  File "main.py", line 17, in <module>
    SumA_B = sum(sum_A, sum_B)
TypeError: 'int' object is not iterable
 

Комментарии:

1. Почему вы должны делать это в коде? Если это целое число в базе данных, не можете ли вы объединить его в самом запросе?

2. @Kris Да, это целое число в базе данных. Как сделать?

3. Измените свой запрос таким SELECT SUM(City) FROM Nation WHERE X =... образом, чтобы он возвращал сумму с самого сервера. Результатом нескольких запросов будет дальнейшее сложение обычных целых чисел!

Ответ №1:

Во-первых, чтобы исправить ошибку, ваша проблема заключается в том, что sum суммируются элементы итеративного объекта, а не переменное количество переданных ему аргументов. Поэтому вам нужно изменить его на итеративный, например:

 sum((sum_A, sum_B))
 

Или, если у вас есть только два элемента, почему бы и нет count_A count_B ?


Затем, чтобы упростить ваши sum s, вы могли бы использовать itertools.chain или более удобные chain.from_iterable , которые используются для выравнивания 2D-списков (как у вас):

 from itertools import chain

sum_A = sum(chain(*count_A))
# Or:
sum_A = sum(chain.from_iterable(count_A))
 

Наконец, вам даже не нужно суммировать A и B отдельно и снова суммировать результат. Просто объедините их и суммируйте сразу:

 total_sum = sum(chain.from_iterable(count_A   count_B))
 

Или, в духе цепочки, вы можете избежать создания нового списка (при выполнении count_A count_B ), связав все кортежи после объединения двух списков:

 total_sum = sum(chain.from_iterable(chain(count_A, count_B)))
 

Комментарии:

1. Спасибо. Позже я внимательно прочитал и ответил. Меня сейчас нет дома

2. Хороший ответ ваш. Спасибо. Я никогда раньше не использовал итерацию. Я новичок в Python. Но если бы я хотел упростить вещи и никогда не использовать итерируемый, что я мог бы сделать? Так что, если я захочу добавить без использования итерируемого? Не могли бы вы показать мне пример кода моего вопроса без interable? Итак, получаем 5, 5, а затем 10 без итераций? Для меня это очень важно. Спасибо

3. Я действительно не понимаю, что вы имеете в виду… Список является итеративным. Вы суммируете список. Как вы можете не использовать итерируемые?

4. Я говорю о «сумме». Могу ли я добавить элементы, содержащиеся в списке или кортеже, не используя «sum», а используя что-то другое? Что? Нравится? Спасибо

5. Да, вы можете использовать цикл и добавлять каждое значение в счетную переменную, но зачем вам это делать, если у вас есть встроенная функция, которая уже делает это за вас?

Ответ №2:

sum ожидает итерацию, используйте:

 SumA_B = sum([sum_A, sum_B])
 

Комментарии:

1. Теперь все в порядке. Что, если бы я захотел изменить фрагмент кода sum_A = sum (int (row [0]) для строки в count_A)? Так что, если бы я хотел заменить его на sum_A = sum (count_A) . Если я напишу sum_A = sum (count_A), я получу сообщение об ошибке (TypeError: неподдерживаемый тип (ы) операнда для : ‘int’ и ‘tuple’). Потому что? Как решить?

2. Сложно ответить на вопрос типа «как мне сделать <что-то неправильно>» 😉 лучше объясните, чего вы ожидаете достичь, приведите пример ввода и ожидаемого результата. Может быть, посмотрите на itertool.chain.from_iterable

3. Входные данные — count_A = cursor . fetchall () #Print [(2,), (1,), (2,)] и count_B = курсор. fetchall () #Print [(3,), (2,)]. Сначала я хотел бы добавить их оба, чтобы получить 5 и 5, а затем я хотел бы получить результат 10 (5 5)

4. Тогда что не так с вашим текущим подходом?

5. Я написал это в вопросе. Мне это не очень понравилось. Я не хочу использовать sum_A = sum (int (row [0]) для строки в count_A) . Я бы использовал sum_A = sum (count_A) или что-то подобное, но получил эту ошибку: TypeError: неподдерживаемые типы операндов для : ‘int’ и ‘tuple’