Я пытаюсь сделать некоторые вычисления во вложенных списках

Например, [['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 возвращает ошибку типа: индексы списка должны быть целыми числами или кусочками, а не кортежем

Что не так с моим кодом?

0
Yiling Liu 20 Авг 2018 в 16:29

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]]
1
Laurent H. 20 Авг 2018 в 14:19

for element in enumerate(students_pclist) назначит кортеж (index, element_of_students_pclist) для element.

Вы хотите:

[[countMean(element[1:]), element[0]] for element in students_pclist]
1
jh314 20 Авг 2018 в 13:33

У вас были проблемы с правильным использованием индекса, возвращаемого 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']]
1
Sheldore 20 Авг 2018 в 13:39

Этот должен делать то, что вам нужно:

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']]
1
zipa 20 Авг 2018 в 13:40

Вы можете использовать функцию ниже, чтобы посчитать среднее значение:

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()
1
Rafał 20 Авг 2018 в 13:52
51931817