Суммирование элементов в списке с целыми числами и строками в Python

новичок в Python здесь. Я пытаюсь научиться выполнять операции со списком смешанных типов:

mylist = ['jack', 12, 'snake', 17, 'tumbleweed', 39]

Если элемент является str, я хочу добавить его в output_str, а если это int, я хочу его суммировать. Вот что я пробовал:

mylist = ['jack', 12, 'snake', 17, 'tumbleweed', 39]

for x in mylist:
    output_str = ''
    if isinstance(x, str):
        output_str += x
        print(output_str)
    elif isinstance(x, int):
        print(sum(x))

Мой ожидаемый результат:

'jacksnaketumbleweed'
68

Но я получаю следующую ошибку:

TypeErrorTraceback (most recent call last)
<ipython-input-404-926417194c69> in <module>()
      5         output_str += x
      6     elif isinstance(x, int):
----> 7         print(sum(x))
TypeError: 'int' object is not iterable

Я не понимаю, почему это происходит. Спасибо

Каков ожидаемый результат?

yatu 17.12.2018 20:47

Что значит суммировать одно число? Сумма - это сложение нескольких чисел.

Carcigenicate 17.12.2018 20:48

Я отредактировал сообщение и добавил ожидаемый результат.

user5265408 17.12.2018 20:49
sum требует итерации, вы передали int.
juanpa.arrivillaga 17.12.2018 20:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
272
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Ответ принят как подходящий

Функция sum предназначена для суммирования всех элементов в массиве, что объясняет ошибку, которую вы получаете. Кроме того, если вы сохраните объявление output_str внутри функции for, каждый раз при сканировании нового значения из вашего списка output_str сбрасывается. Вот почему я сейчас заявляю об этом только один раз, еще до запуска for.

Я также добавил переменную final, которая будет отвечать за хранение суммы всех чисел на данный момент. Итак, что у нас есть:

mylist = ['jack', 12, 'snake', 17, 'tumbleweed', 39]
final = 0
output_str = ''

for x in mylist:

    if isinstance(x, str):
        #here, we will concatenate each x value with the current value of output_str
        output_str += x

    elif isinstance(x, int):
        #and here, everytime x is a number, we will sum it to final's current value. This operation is equal to final = final + 1
        final += x

print(output_str)
print(final)

Попробуй это:

mylist = ['jack', 12, 'snake', 17, 'tumbleweed', 39]

total = 0
output_str = ''
for x in mylist:
    if isinstance(x, str):
        output_str = output_str + x
    elif isinstance(x, int):
        total += x
print(output_str)
print(total)

Вы не можете выполнить суммирование для одного элемента, для суммы требуется итеративный тип ввода. Сделать это можно так:

Код:

mylist = ['jack', 12, 'snake', 17, 'tumbleweed', 39]

output_str = ''
sum_of_int = 0

for x in mylist:
    if isinstance(x, str):
        output_str += x
    elif isinstance(x, int):
        sum_of_int += x

print(output_str)
print(sum_of_int)

Вывод:

jacksnaketumbleweed
68

Вы также можете сделать это так:

mylist = ['jack', 12, 'snake', 17, 'tumbleweed', 39]
output_str = ''
sum = 0

for i in mylist:
    if type(i) == str:
        output_str += i   
    elif type(i) == int:
        sum += i

Теперь sum будет содержать сумму целых чисел в вашем списке, а output_str будет содержать конкатенацию всех строк в вашем списке.

Функция сумма () ожидает итерацию. Попробуй это:

from functools import reduce

mylist = ['jack', 12, 'snake', 17, 'tumbleweed', 39]
n, s = reduce(lambda a, x: (a[0] + x, a[1]) if isinstance(x, int) else (a[0], a[1] + x), mylist, (0, ''))
print('n = {}; s = {};'.format(n, s))

Вывод:

n = 68; s = jacksnaketumbleweed;

Вы можете использовать сумма и присоединиться:

my_list = ['jack', 12, 'snake', 17, 'tumbleweed', 39]
a, b = sum(e for e in my_list if isinstance(e, int)), ''.join(s for s in my_list if isinstance(s, str))
print(a, b)

Вывод

68 jacksnaketumbleweed

Если список включает как числа с плавающей запятой, так и целые числа, вы можете использовать Число:

from numbers import Number

my_list = ['jack', 12, 'snake', 17, 'tumbleweed', 39.0]
a, b = sum(e for e in my_list if isinstance(e, Number)), ''.join(s for s in my_list if isinstance(s, str))
print(a, b)

Вывод

68.0 jacksnaketumbleweed

Используйте понимание списка, которое быстрее, удобнее и проще:

mylist = ['jack', 12, 'snake', 17, 'tumbleweed', 39]

int_sum = sum([i for i in mylist if isinstance(i, int)])
str_join = ' '.join([i for i in mylist if isinstance(i, str)])

print(str_join)
print(int_sum)

Вывод:

C:\Users\Documents>py test.py
jack snake tumbleweed
68

Вы могли:

mylist = ['jack', 12, 'snake', 17, 'tumbleweed', 39]
ints = [str(i).isnumeric() for i in mylist]
ix_int = np.flatnonzero(ints)
np.array(mylist)[ix_int].astype(int).sum()
68

А для струнных:

ix_str = np.setdiff1d(np.arange(len(mylist)), indices)
''.join(np.array(mylist)[ix_str])
'jacksnaketumbleweed'

Другие вопросы по теме