Как усреднить только первое и второе значения в словаре списков?

#python #list #dictionary #average

Вопрос:

У меня есть словарь, в котором каждый ключ сопоставляется со значением списков (в частности, координат):

3 -> [[‘7′, ’16’], [’72’, ’48’], [’36’, ’52’], [’75’, ’36’], [’52’, ’28’], [’76’, ’44’], [’56’, ’35’], [’15’, ’21’], [’88’, ’32’], [’61’, ’34’], [’94’, ’12’], [’71’, ’59’], [’25’, ’16’], [’62’, ‘1’], [’16’, ’32’], [’71’, ‘4’], [’42’, ’32’], [’37’, ’49’], [’49’, ’34’], [‘3’, ‘5’], [’49’, ’40’], [’40’, ’53’], [’57’, ’48’], [’10’, ‘9’], [’97’, ‘3’]]

2 -> [[’71’, ’84’], [’32’, ’74’], [’51’, ’85’], [’55’, ’96’], [’34’, ’64’], [’76’, ’75’], [’54’, ‘100’], [’60’, ’85’], [’40’, ’78’], [’78’, ’91’], [‘100′, ’98’], [’42’, ’77’], [’39’, ’60’], [’38’, ’77’], [’66’, ’67’], [’66’, ’76’], [’86’, ’68’]]

1 -> [[’11’, ’69’], [’10’, ’74’], [’10’, ’75’], [’14’, ’77’], [‘2′, ’60’], [’14’, ’99’], [’10’, ’60’], [‘8′, ’87’]]

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

Любая помощь будет очень признательна!

Ответ №1:

Вы можете использовать dict.items() функцию для перебора ключей и значений и просто рассчитать среднее значение ваших Xs и Ys.

Вот пример кода:

 def avg(list):
    return sum(list) / len(list)

for k, v in dict.items():
    x_sum = avg([int(e[0]) for e in v])
    y_sum = avg([int(e[1]) for e in v])
 

Конечно, вам нужно преобразовать строки в целые числа (или числа с плавающей точкой), так как они являются строками для вас.

Ответ №2:

Вы можете использовать zip() в списках координат, чтобы выделить все X и Y в отдельные списки, которые затем можно обработать для вычисления среднего значения:

 D = {
     3:[['7', '16'], ['72', '48'], ['36', '52'], ['75', '36'], ['52', '28'], ['76', '44'], ['56', '35'], ['15', '21'], ['88', '32'], ['61', '34'], ['94', '12'], ['71', '59'], ['25', '16'], ['62', '1'], ['16', '32'], ['71', '4'], ['42', '32'], ['37', '49'], ['49', '34'], ['3', '5'], ['49', '40'], ['40', '53'], ['57', '48'], ['10', '9'], ['97', '3']],
     2:[['71', '84'], ['32', '74'], ['51', '85'], ['55', '96'], ['34', '64'], ['76', '75'], ['54', '100'], ['60', '85'], ['40', '78'], ['78', '91'], ['100', '98'], ['42', '77'], ['39', '60'], ['38', '77'], ['66', '67'], ['66', '76'], ['86', '68']],
     1:[['11', '69'], ['10', '74'], ['10', '75'], ['14', '77'], ['2', '60'], ['14', '99'], ['10', '60'], ['8', '87']]
    }

A = {k:[sum(map(float,x))/len(v),sum(map(float,y))/len(v)] 
     for k,v in D.items() for x,y in [zip(*v)]}

print(A)
{3: [50.44, 29.72], 2: [58.11764705882353, 79.70588235294117], 1: [9.875, 75.125]}
 

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

Как только ваши данные будут приведены к удобному числовому типу, код для вычисления средних значений станет проще/понятнее:

 D = {k:[ [float(x),float(y)] for x,y in v] for k,v in D.items() }

A = {k:[sum(x)/len(v),sum(y)/len(v)] for k,v in D.items() for x,y in [zip(*v)]}