Как найти среднее значение вложенного списка, используя цикл for? - PullRequest
0 голосов
/ 29 октября 2019

Я не могу импортировать какие-либо модули, чтобы найти среднее значение, только цикл for. По сути, мне нужно найти среднее значение для вложенного списка.

def get_average(map: List[List[int]]) -> float:
    """Return the average across all cells in the  map.



    >>> get_average(3X3)
    5.0
    >>> get_average(4X4)
    3.8125
    """
    total = 0
    for sublist in range(len(map)): #gives sublist 
        for i in range(sublist): #access the items in the sublist
            total = total + i 
        average = total / len(map)
    return average  

Выход для get_average (4X4) равен 1,0

Ответы [ 4 ]

3 голосов
/ 29 октября 2019
L  =[[1, 2, 6, 5],
     [4, 5, 3, 2],
     [7, 9, 8, 1],
     [1, 2, 1, 4]]

def func(l):
    total_sum = sum([sum(i) for i in l])
    # make the sum of inner lists, store them in the list and then get the sum of final list

    count = sum([len(i) for i in l]) # get the total element in the list
    return total_sum/count # return average

print(func(L))

output

3.8125

какой код операции должен быть

def get_average_elevation(elevation_map):
    """Return the average elevation across all cells in the elevation map
    elevation_map.

    Precondition: elevation_map is a valid elevation map.

    >>> get_average_elevation(UNIQUE_3X3)
    5.0
    >>> get_average_elevation(FOUR_BY_FOUR)
    3.8125
    """
    total = 0
    count = 0
    for sublist in range(len(elevation_map)): # gives sublist index
        for i in range(len(elevation_map[sublist])): # gives index of item in sublist
            count+=1
            total = total + elevation_map[sublist][i] 

    return total/count

l = [[1, 2, 6, 5],
                [4, 5, 3, 2],
                [7, 9, 8, 1],
                [1, 2, 1, 4]]

print(get_average_elevation(l))

почему наступает отклонение, это потому что

скажем, список l = [1,2,3,4]

, поэтому для этого списка for i in range(len(l)) будет повторяться только 4 раза, но он не будет давать элемент внутри списка (который, по мнению оператора, даст), но range возвращает объект, который повторяется в инклюзивном диапазоне. дать список от начала до конца-1.

какой операционный элемент был элементом в списке, для этого ему нужно использовать for element in list это даст индивидуальный элемент, в этом квесте относительно внутреннего списка.

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

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

2 голосов
/ 29 октября 2019

Вы неправильно понимаете разницу между индексом и содержимым списка.

for sublist in range(len(elevation_map)): #gives sublist 

Нет, это не так. sublist перебирает индексы из elevation_map, значения 0-3.

    for i in range(sublist): #access the items in the sublist

Опять нет. i перебирает значения 0- sublist, которые находятся в диапазоне 0-3.

В результате total завершается суммой 0 + (0 + 1) + (0 + 1 + 2) = 4. Вот как вы получили среднее значение 1,0

Вместо этого запишите свои циклы, чтобы они работали так, как описывают ваши комментарии:

def get_average_elevation(elevation_map):
    """Return the average elevation across all cells in the elevation map
    elevation_map.

    Precondition: elevation_map is a valid elevation map.

    >>> get_average_elevation(UNIQUE_3X3)
    5.0
    >>> get_average_elevation(FOUR_BY_FOUR)
    3.8125
    """
    total = 0
    for sublist in elevation_map: #gives sublist 
        for i in sublist: #access the items in the sublist
            total = total + i 
        average = total / len(elevation_map)
    return average  

Теперь, это складывает все 16 элементов и делит на количество строк , в результате чего вы получите 15.25. Я думаю, что вам нужно количество элементов , поэтому вам нужно посчитать или вычислить это вместо этого.

Можете ли вы взять его оттуда?

1 голос
/ 29 октября 2019

Ваш код, вероятно, не работает, потому что for sublist in range(len(elevation_map)): будет перебирать генератор, который производит [1,2,3,4]. Вы никогда не получите доступ к этим фактическим числам в массиве elevation_map. Внутренний цикл страдает от той же проблемы.

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

flat_list = [item for sublist in elevation_map for item in sublist]
average = sum(flat_list) / len(flat_list)
0 голосов
/ 29 октября 2019

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

FOUR_BY_FOUR = [[1, 2, 6, 5],
                [4, 5, 3, 2],
                [7, 9, 8, 1],
                [1, 2, 1, 4]]

UNIQUE_3X3 = [[1, 2, 3],
              [9, 8, 7],
              [4, 5, 6]]

answer = [i for k in FOUR_BY_FOUR for i in k]
print(sum(answer)/16)

answer = [i for k in UNIQUE_3X3 for i in k]
print(sum(answer)/9)

Это возвращает:

3.8125
5.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...