#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’