Вы можете сделать это с помощью простого один лайнер:
l1 = [1, 2, 3, 'A']
sum(filter(lambda i: isinstance(i, int), l1))
# prints 6
Или, если вам это нужно внутри функции:
def foo(l1):
return sum(filter(lambda i: isinstance(i, int), l1))
Кроме того, как отмечено в комментариях, не использовать имена типа dict
и list
для ваших переменных; * они будут затенять их имена для словаря (dict
) и (list
). Затем вам нужно явно указать del dict, list
, чтобы использовать их по назначению.
Но, позвольте мне объяснить. Что filter
делает здесь:
а) Он принимает функцию в качестве первого аргумента:
# this function will return True if i is an int
# and false otherwise
lambda i: isinstance(i, int)
, а затем принимает каждый элемент в списке l1
(второй аргумент) и оценивает ли он True
или False
на основе функции.
б) Затем filter
будет существенно отфильтровать любые объекты внутри списка l1
, которые не являются экземплярами int
(т.е. функция возвращает False
для них). В результате для списка, такого как [1, 2, 3, 'A']
, фильтр собирается вернуть [1, 2, 3]
, который затем будет подведено sum()
.
Некоторые примеры:
foo([1, 2, 3, 'A'])
# 6
foo([1, 2, 3])
# 6
foo([1, 2, 3, 'HELLO', 'WORLD'])
# 6
Незначительный нюанс:
Как есть, это не суммируется float
значения, она падает их (и любые другие числовые типы для этого случая). Если вам нужно, что тоже, просто добавьте float
типа в функции lambda
, как так:
lambda i: isinstance(i, (int, float))
Теперь ваши функции суммы поплавки тоже:
foo([1, 2, 3, 3.1, 'HELLO', 'WORLD'])
# 9.1
Добавьте любые другие типы по мере необходимости в функции lambda
чтобы поймать дела, которые вам нужны.
Улов все дело:
Как отметил @Copperfield вы можете проверить для объектов, которые являются экземплярами любого числа пути использования numbers.Number
абстрактного базового класса в numbers
модуль. Это действует как броской всех случаях для числовых значений:
import numbers # must import
sum(filter(lambda i: isinstance(i, numbers.Number), l1))
Simpler и немного быстрее, тоже:
Кроме того, как отметил @ShadowRanger, и с тех пор lambda
might not be the most comfortable construct for new users, можно было бы просто использовать a generator expression (который также быстрее) с sum
, чтобы получить тот же самый точный результат:
sum(val for val in l1 if isinstance(val, numbers.Number))
Заменить 'список [I] .str' с' Str (список [I]) '. – Delgan
Звучит как домашнее задание для меня. –
@ JonasGröger Он отправил код, который он написал, я думаю. – Delgan