Я пытаюсь сделать некоторые вычисления во вложенных списках
Например, [['Amy',2,3,4],['Jack',3,4,None]]
, и я хочу увидеть вывод, например: [[3.0,'Amy'],[3.5,'Jack']]
(3,0 означает среднее значение 2,3,4 и 3,5 означает среднее значение 3,4)
Мой код:
def compute_mean_pc():
students_pclist=[['Amy',2,3,4],['Jack',3,4,None]]
mean_pc=[[[countMean(students_pclist[element][1:])]for element in enumerate(students_pclist)]+[element[0]]for element in students_pclist]
print(mean_pc)
def countMean(array):
count=0
sumup=0
for i in range(len(array)):
if array[i]!=None:
count+=1
sumup+=array[i]
mean=sumup/count
return mean
compute_mean_pc()
Вторая часть, countMean (массив) работает хорошо, но для первой части, в этой строке
mean_pc=[[[countMean(students_pclist[element][1:])]for element in enumerate(students_pclist)]+[element[0]]for element in students_pclist]
Python возвращает ошибку типа: индексы списка должны быть целыми числами или кусочками, а не кортежем
Что не так с моим кодом?
5 ответов
Неправильная часть в вашем коде for element in enumerate(students_pclist)
внутри вашего списка: перечислить () возвращает кортеж в каждом цикле итерации. Так что вы должны были написать что-то вроде for element,i in enumerate(students_pclist)
. Это исправляет вашу ошибку, но не дает ожидаемого ответа.
Вот предложение полного исправления, основанного на вашем коде:
myListOfLists = [['Amy',2,3,4], ['Jack',3,4,None]]
def compute_mean_pc():
students_pclist=[['Amy',2,3,4],['Jack',3,4,None]]
mean_pc=[ [countMean(student[1:])] +[student[0]] for student in students_pclist]
print(mean_pc)
def countMean(array):
count=0
sumup=0
for i in range(len(array)):
if array[i]!=None:
count+=1
sumup+=array[i]
mean=sumup/count
return mean
compute_mean_pc()
# [[3.0, 'Amy'], [3.5, 'Jack']]
И, наконец, я предлагаю вам код, который является более эффективным и все еще читаемым, используя старый добрый цикл for:
myList = [['Amy',2,3,4], ['Jack',3,4,None]]
def compute_mean_pc(myList):
result = []
for name, *values in myList: # iterate over each sub-list getting name and next values
values = list(filter(None,values)) # Remove any 'None' from the values
result.append([name, sum(values)/len(values)]) # Append a list [name,mean(values)] to the result list
return result
result = compute_mean_pc(myList)
print(result) # [['Amy', 3.0], ['Jack', 3.5]]
for element in enumerate(students_pclist)
назначит кортеж (index, element_of_students_pclist)
для element
.
Вы хотите:
[[countMean(element[1:]), element[0]] for element in students_pclist]
У вас были проблемы с правильным использованием индекса, возвращаемого enumerate
. Я просто немного изменил ваш код, указав правильный способ использования enumerate
def compute_mean_pc():
students_pclist=[['Amy',2,3,4],['Jack',3,4,None]]
mean_pc=[[ countMean(students_pclist[i][1:]) ] + [element[0]] for i, element in enumerate(students_pclist)]
print(mean_pc)
Вывод
[[3.0, 'Amy'], [3.5, 'Jack']]
Этот должен делать то, что вам нужно:
a = [['Amy',2,3,4],['Jack',3,4,None]]
def computeMean(array):
valid = [i for i in array[1:] if i]
return [sum(valid)/len(valid)]
result = [computeMean(sub) + sub[:1] for sub in a]
result
#[[3.0, 'Amy'], [3.5, 'Jack']]
Вы можете использовать функцию ниже, чтобы посчитать среднее значение:
def compute_mean_pc():
students_pclist=[['Amy',2,3,4],['Jack',3,4,None]]
mean_pc=[ [student[0], count_mean(student)] for student in students_pclist]
print(mean_pc)
def count_mean(array):
grades = [el for el in array if isinstance(el, int)]
return sum(grades) / len(grades)
compute_mean_pc()
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.