2015-10-12 4 views
0

Итак, согласно совету утиного ввода, вам не рекомендуется проверять типы на python, но просто проверьте, не удалась ли операция или не удалось выполнить операцию. В этом случае, как я могу суммировать список (главным образом) чисел, но не указывая строки.Содержит список python без строковых значений

sum([1,2,3,4,'']) #fails 
sum(filter(lambda x: type(x)==int, [1,2,3,4,''])) #bad style 
+3

Почему у вас есть строки, смешанные с номерами? –

+0

Я думаю, что это проницательный вопрос, потому что я по сути рассматриваю строки как «недостающие данные». Это, конечно, приводит к таким проблемам, как sum (filter (lambda x: type (x) == int, ['', '', ''])) == 0, тогда как это должно быть (скажем) Нет – user2667066

+0

Если все строки в вашем списке «', то вы можете использовать' sum ([v для v в [1,2,3,4,' '], если v]) '. – kkpattern

ответ

2

я буду делать что-то вроде этого

a = [1,2,3,4,''] 
print sum(x if not isinstance(x,str) else 0 for x in a) 
+0

Я выбрал это как ответ, поскольку он справится, даже если есть (например) плавающие в списке (хотя я знаю, что это не было в исходном вопросе). – user2667066

+0

У меня это было в голове, поэтому я ответил так. –

2

Ну, я вижу два основных решения здесь:

  • Предварительная обработка: Фильтр входных данных для того, чтобы не допустить вхождения 'missing data', может быть довольно сложным. Мы не можем помочь вам в этом вопросе без дополнительной информации.
  • Постобработка: отфильтруйте список результатов и удалите 'missing data', легко, но он не масштабируется.

О постобработки, здесь есть решение, используя список понимание, и другой, используя ваш filter основанное подход:

a = [1,2,3,4,''] 
filtered_a = [x for x in t if isinstance(x, int)] 
filtered_a = filter(lambda x: isinstance(x, int), a) 

Затем, вы можете просто сделать sum(filtered_a)

Мы также можем утверждать, что вы можете проверить согласованность данных во время обработки и просто не добавлять строку в свой массив.

+0

Дополнительные '[]' не требуются в 'sum()'. –

+0

Спасибо, ребята, = D это исправлено! – NiziL

+0

Лучший подход - не использовать тип, а использовать вызовы isinstance. Ловушка использования типа заключается в том, что кто-то может подклассировать int в будущем, а затем ваш код не будет работать. Итак, +1 для этого – csharpcoder

Смежные вопросы