новичок в 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
Я не понимаю, почему это происходит. Спасибо
Что значит суммировать одно число? Сумма - это сложение нескольких чисел.
Я отредактировал сообщение и добавил ожидаемый результат.
sum
требует итерации, вы передали int
.
Функция 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'
Каков ожидаемый результат?