#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)]}