2017-02-21 44 views
0

Я начинающий Python, и у меня есть задача, в которой мне нужно создать свои собственные функции, чтобы найти сумму и среднее из списка. Я попытался сделать следующие формулы:Python: ошибка операнда, когда я пытаюсь запустить функции для поиска суммы и среднего значения

import math 

list1 = ['ABC123', 0.00095, 0.00081, 0.0023, 0.00209, 0.0017, 0.00215, 0.00167, 0.00164, 0.00206, 0.00233, 0.00239, 0.00242, 0.0023, 9e-05, 0.00177, 0.001] 

def samplesum(my_list): 
    '''Finds the sum of a list''' 
    total_sum = 0 
    for element in my_list: 
     total_sum += element 
    return total_sum 


def samplemean(my_list): 
    """Finds the mean of a list""" 
    sum_of_num = sum(my_list) 
    list_mean = sum_of_num/len(my_list) 
    return list_mean 

samplesum(list1) 
samplemean(list1) 

Когда я запускаю сценарий, я получаю сообщение об ошибке:

File "Task.py", line 136, in <module> 
    samplesum(list1) 
File "Task.py", line 120, in samplesum 
    total_sum += element 
TypeError: unsupported operand type(s) for +: 'int' and 'str' 

или если отключить звук из функции samplesum(my_list) с помощью # я получаю эту ошибку для samplemean(my_list)

File "Task.py", line 137, in <module> 
    samplemean(list1) 
File "Task.py", line 125, in samplemean 
    sum_of_num = sum(my_list) 
TypeError: unsupported operand type(s) for +: 'int' and 'str' 

Что я делаю неправильно?

UPDATE: Как было указано в нескольких комментариях, оказалось, что у меня была одна строка в этом списке в дополнение к целым числам. Я удалил его, переопределив список без строки, но я думаю, что это считается жестким кодированием, а инструкции присваивания не позволяют жесткого кодирования. Как я могу заставить Python игнорировать строки из списка, используя эти формулы?

+0

Похоже, что 'list1' имеет хотя бы один элемент, который является строкой. Как создается «list1»? – Lucas

+0

Добро пожаловать в StackOverflow. Прочтите и следуйте инструкциям по отправке в справочной документации. [Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve) применим здесь. Мы не можем эффективно помочь вам, пока вы не разместите свой код MCVE и не сможете точно описать проблему. В частности, ваш опубликованный код не воспроизводит проблему, так как ваш код умирает в первой исполняемой строке. – Prune

+0

@biocoder Можете ли вы разместить содержимое списка1? –

ответ

1

Update:

На основе ваш вопрос обновления, вы можете достичь его:

>>> mylist = [1,2,3,"4", "str"] 
>>> [int(x) for x in mylist if str(x).isdigit()] ------> ONE 
[1, 2, 3, 4] 
>>> [int(x) for x in mylist if isinstance(x, int) ] ------>TWO 
[1, 2, 3] 

Например ONE: удаляет строку str, но сохраняет и преобразует числовой строки "4" в interger 4.

Например, TWO: сохраняет только целые числа

Оригинал:

Python не поддерживает добавление между числовой строкой и целым числом, вы должны преобразовать все числовой строку в целое, а затем добавить их

Преобразовать все элементы вашей mylist в целом:

mylist = [int(v) for v in mylist] 

Или вы можете конвертировать их все, прежде чем проход list1 к вашим samplesum() й samplemean

list1 = [int(v) for v in list1] 

Тогда

for element in mylist: 
    total_sum += element 
+0

Оказывается, у меня была одна строка в этом списке. Я удалил его, переопределив список без него, но я думаю, что это считается жестким кодированием, а инструкции присваивания препятствуют жесткому кодированию. Это то, что вы показываете мне, как заставить Python игнорировать строки из списка? Или как вы это сделаете? – biocoder

+0

Я думал, что у вас есть числовая строка в вашем списке. например, "1" + 1 "будет вызывать ошибку типа. Вот почему я упомянул преобразование 'числовой строки' в целое, отличное от преобразования строки в целое. Рад, что вы решили свою проблему. – haifzhan

+0

Пожалуйста, ознакомьтесь с моим обновленным вопросом, чтобы увидеть список, который я использовал. Вы знаете, как заставить функцию пропускать строку, поэтому мне не нужно переопределять список? – biocoder

0

Учитывая обновленный вопрос, вы могли бы думать о проблеме, как:

  • игнорировать строки
  • рассматривать только число

Это два варианта:

# only consider numbers 
list1 = [x for x in list1 if isinstance(x, (int, float, long))] 

# ignore strings 
list1 = [x for x in list1 if not isinstance(x, basestring)] 
+0

Это сработало! Спасибо. – biocoder

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

  • Нет связанных вопросов^_^